p1154 地平线

 题目描述 

  Farmer John的牛们认为,太阳升起的那一刻是一天中最美好的,在那时她们
可以看到远方城市模糊的轮廓。显然,这些轮廓其实是城市里建筑物模糊的影子。
  建筑物的影子实在太模糊了,牛们只好把它们近似地看成若干个边长为1单位
长度的正方体整齐地叠在一起。城市中的所有建筑物的影子都是标准的矩形。牛们
的视野宽W个单位长度(1<=W<=1,000,000),不妨把它们按从左到右划分成W列,并
按1~W编号。建筑物的轮廓用N组(1<=N<=50,000)数给予描述,每组数包含2个整数
x、y(1<=x<=W,0<=y<=500,000),表示从第x列开始,建筑物影子的高度变成了y。
(也就是说,第x[i]列到第x[i+1]-1列中每一列建筑物影子的高度都是y[i]个单位
长度)

  贝茜想知道这座城市里最少有多少幢建筑物,也就是说,这些影子最少可以由
多少个矩形完全覆盖。当然,建筑物的影子可以有重叠。请你写一个程序帮她计算
一下。

城市的轮廓可能是这样:
..........................
.....XX.........XXX.......
.XXX.XX.......XXXXXXX.....
XXXXXXXXXX....XXXXXXXXXXXX

于是它可以用(1,1),(2,2),(5,1),(6,3),(8,1),(11,0),(15,2),(17,3),(20,2),(22,1)
这10组数进行描述。

不难看出,这座城市里最少有6幢建筑物。以下是这些建筑物的一种分布的可能:

..........................  ..........................
.....22.........333.......  .....XX.........XXX.......
.111.22.......XX333XX.....  .XXX.XX.......5555555.....
X111X22XXX....XX333XXXXXXX  4444444444....5555555XXXXX

..........................
.....XX.........XXX.......
.XXX.XX.......XXXXXXX.....
XXXXXXXXXX....666666666666

具体图形请粘贴到记事本里会对齐。

 

样例输入:

10 26
1 1
2 2
5 1
6 3
8 1
11 0
15 2
17 3
20 2
22 1

输出:

6

思路:

这到题是一个单调栈的题,就是让轮廓的高度依次进栈,如果刚刚进入的高度小于栈顶的高度,就让栈顶出栈,在比较他和栈顶的高度,如果相等则ans++;最后用n-ans得出答案,因为楼全是矩形,所以奶牛看到的n个高度是矩形重叠形成的,所以用看到的总高度减去重叠的数,就得出有几栋楼了。

 

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int stack[100000],top=0;
int main()
{
    int n,w;
    cin>>n>>w;
    int ans=0;
    stack[++top]=0;
    for(int i=1;i<=n;i++)
    {
        int x,y;
        cin>>x>>y;
        while(top&&stack[top]>=y)
        {
            if(stack[top]==y)
                ans++;
            top--;
        }
        stack[++top]=y;
    }
    cout<<n-ans<<endl;
    return 0;
}

 

posted @ 2017-02-28 08:32  列車員lcy  阅读(195)  评论(0编辑  收藏  举报