hrbsut 2151 变形金刚 (单调栈)

变形金刚
Time Limit: 3000 MSMemory Limit: 32768 K
Total Submit: 38(15 users)Total Accepted: 14(13 users)Rating: Special Judge: No
Description

新一轮变形金刚来袭,这次霸天虎的头领叫做吊炸天。吊炸天有一个酷炫的攻击技能,能够横向摧毁一个矩形区域内的高楼大厦。但是有个弱点,这个矩形区域必须充满建筑物(不能有空白)。现在吊炸天面对一座城市,假设建筑物都是紧密挨着的(没有缝隙),现在按照顺序给你一些建筑物的宽和高(二维)。 这样的话...吊炸天一次性能摧毁的最大建筑面积是多少?(不考虑区域外造成的损坏)

Input
 

多组测试数据:

每组数据的第一行是一个整数n,表示建筑物的数目;

接下来的n行,每行有两个整数 w,h,分别表示对应建筑物的宽和高。

(1<= T <= 50, 1 <= n <= 50000,0<=总面积<=10^9)

如果n等于0 则结束。

Output
     对于每组数据,输出能一次性摧毁的最大面积。
Sample Input

2

3 4

1 3

3

3 4

1 2

3 4

0

Sample Output

12

14

Source
2014暑假集训练习赛(8月6日)
题意分析 :

暴力会超时的。。。哇哇哇哇。。

单调栈   ,。

先将栈转化为单调递增的栈。

为啥呢。。

因为如果相邻的下一个比上一个要小的话那么他就不能继续往下连接了对不对??///哇,你表达的我根本听不懂啊。。。还是看代码吧。

建立一个栈   stack  < pair < int ,int > > s;///为了省事就用pair了,第一个元素的 high 第二个是weight 

int w=0;

while( !s.empty( ) && high <= s.top().first())

{

w += s.top().second ;

res = max(res,w * s.top().first );

s.pop();

}

s.push(make_pair(high , weight + w));///这里加上前边的为啥呢,,自己手动跑吧。。。


------------------------------------------------------------------------------------------------------------

你瞅瞅经历了上边的一遍骚操作你会很神奇的发现这个栈已经是单调递增的了。

不要问为啥啊。你自己跑一下就知道了。。。

我们的操作不就为了这个吗。。。。

-------------------------------------------------------------------------------------------------------------

现在进行第二的骚操作了。

int tmp = 0;

while(!s.empty())

{

tmp+=s.top().second ;

res = max( res,  tmp*s.top().first);

s.pop();

}

---------------------------------------------------差不多了

上代码

#include<bits/stdc++.h>
using namespace std;
int a;
int main()
{
    int n;
    while(scanf("%d",&n)==1&&n)
    {
        stack<pair<int ,int >>s;
        int res=0;
        int high , weight;
        for(int i = 0; i < n ; i++)
        {
            scanf("%d %d",&weight,&high);
            int w=0;
            while(!s.empty()&&high <= s.top().second)
            {
                int mh=s.top().second;
                int mw=s.top().first;
                s.pop();
                w+=mw;
                res=max(res,mh*w);
            }
            s.push(make_pair(weight+w,high));
        }///以上部分使得栈的first 元素是 单调递增 。。。
       // printf("%d\n",res);
        int tmp = 0;
        while(!s.empty())
        {
            tmp+=s.top().first;//printf("s :%d %d\n",s.top().first ,s.top().second);
            res=max(res,s.top().second*tmp);
            s.pop();
        }
        printf("%d\n",res);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值