Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 2428 | Accepted: 1215 |
Description
Input
Output
Sample Input
3 1 2 3 4 1 2 3 3 4 1 2 3 4 -1
Sample Output
12 14
测试用例的情况
解题分析:
//想骂人,简单的题意说的那么高深,特别是最后一句,估计管理员要阴笑啦 //大致题意:给定连续的矩形的宽和长,求出最大的连续矩形的面积 /* 维护一个栈中元素高度单调递增的栈,初始化栈中第一个元素高度宽度均为0, 然后每次读入一个矩形,若它比栈顶元素还高就直接进栈, 否则不断将栈中元素弹栈,直到当前栈顶元素能够与读入的矩形满足高度递增。 弹栈过程中累加弹出的元素的宽度,然后每弹出一个就判断当前弹出元素的高度× 累加的宽度能否更新最大面积ans。然后以新的矩形作高, 已经弹出栈的元素总宽度加上新矩形宽度作宽,把这个矩形插入到栈里。 最终栈肯定是一个单调的,只需要再把栈一个个弹空,弹栈过程中仍像上面那样计算即可。 */ #include <iostream> #include <cstring> #include <stack> using namespace std; typedef struct Node { int w,h; }Node; int main() { int i,j,k,T; stack <Node > s; while(cin>>T,~T) { int max_area = 0; int total_w,cur_area; Node *rect = new Node[T+2]; for(i=0;i<T;i++) { cin>>rect[i].w>>rect[i].h; if(s.empty()) s.push(rect[i]); else { total_w=cur_area=0; if(rect[i].h>=s.top().h)//此处是大于等于 s.push(rect[i]); else { while(!s.empty()) { if(rect[i].h<s.top().h)//此处只是小于 { total_w += s.top().w; if((cur_area=total_w*s.top().h)>max_area) max_area = cur_area; s.pop(); } else break;//跳出和继续下一次是不一样的 } total_w += rect[i].w; rect[i].w = total_w; s.push(rect[i]); } } } total_w = cur_area = 0; while(!s.empty()) { total_w += s.top().w; if((cur_area=total_w*s.top().h)>max_area) max_area = cur_area; s.pop(); } cout<<max_area<<endl; delete []rect;//加不加均AC } //system("pause");
s.clear();//没加也AC return 0; }