您的位置:首页 > 其它

hrbsut 2151 变形金刚 (单调栈)

2017-07-24 18:02 176 查看
变形金刚
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));///这里加上前边的为啥呢,,自己手动跑吧。。。

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

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

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

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

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

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

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: