zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    CCF NOI1006 捡石头
    POJ NOI MATH-7648 蓄水池水管问题
    CCF NOI1005 存款收益
    CCF NOI1004 填充矩形
    CCF NOI1003 猜数游戏
    CCF NOI1002 三角形
    Project Euler Problem 26 Reciprocal cycles
    HDU1799 循环多少次?
    CCF NOI1001 温度转换
    POJ NOI MATH-7647 余数相同问题
  • 原文地址:https://www.cnblogs.com/lcyhaha/p/6477215.html
Copyright © 2011-2022 走看看