问题描述:
贴海报:小明接到老板的一个任务,老板要他在一块由高低不一的木板拼接而成的墙上贴海报。 海报是由矩形构成的。看着这高低不一的墙,小明想了一个问题:在这一面墙上能贴的海报 的最大面积究竟是多大呢?其中每一块木板的宽均为 1,且每块木板高度各不相同。现在,你的任务就是帮他完成他的疑问,求出在这面墙上可以贴的海报的最大面积。图 2 阴影部分就是最大面积的海报。
★数据输入
输入数据的第一行是一个整数 N(1≤N≤100,000),表示墙由 N 个木板组成。紧接着 N 个 整数 h1,...,hn(0≤ hi ≤20,000, 1≤ i≤ N),表示按从左到右顺序给出的木板的高度。矩形的宽度为 1。
★数据输出
输出一个整数 S,表示以 X 轴为底边的最大矩形的面积。
#include<iostream> #include<cstdio> #define MAX 100005 using namespace std; struct Elem { int high;//矩形高度 int wide;//矩形宽度 }stack[MAX]; int main() { int i, n, tmp, top; _int64 ans, s, w;//ans:当前最大面积,s为当前出栈元素得高度为最小值时得最大面积,w:需要加得宽度 while (scanf_s("%d", &n) != EOF) { ans = 0; top = 0;//当前栈为空 for (int i = 0; i < n; i++) { scanf_s("%d",&tmp); w = 0; while (top > 0 && stack[top - 1].high >= tmp) {//若栈非空且当前元素得高度小于等于栈顶元素 s = stack[top - 1].high*(stack[top - 1].wide + w);//出栈并更新最大面积 if (s > ans) { ans = s; } w += stack[top - 1].wide;//更新需要为新栈顶元素叠加得宽度 top--; } stack[top].high = tmp; stack[top].wide = 1 + w;//在本身宽度得基础上需要叠加得宽度 top++; } w = 0; while (top > 0) { s = stack[top - 1].high*(stack[top-1].wide+w); if (s > ans) { ans = s; } w += stack[top - 1].wide; top--; } printf("%I64d\n",ans); } system("pause"); return 0; }