题目:http://acm.hdu.edu.cn/showproblem.php?pid=1506
题目要求求出最大的面积,那就从左向右检索
例
2 1 2 2
思路:知道假如一直是 1 2 3 4这样递增的情况,那么面积就是
41或32或23或41中最大的那个
代入例子中,先放入2
2
1:21(高度乘以长度)
放入1 发现1比2小,后面无论多大也无法再与第一个2联动了
所以把2也变成1
1 1
所以2:12
然后
1 1 2
3:21或13
然后以此类推
代码:
#include<iostream>
#include<algorithm>
using namespace std;
long long a[100010];
long long b[100010];
int w[100010];
int main()
{
int k = 0;
int n;
while (cin >> n)
{
long long last = 0;
if (n == 0)
{
break;
}
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
a[n+1]=0;
for (int i = 1; i <= n + 1; i++)
{
if (a[i] > b[k])
{
b[++k] = a[i];
w[k] = 1;
}
else
{
int width = 0;
while (a[i] <= b[k] && k)
{
width += w[k];
last = max((long long)width*b[k], last);
k--;
}
w[++k] = width + 1;
b[k] = a[i];
}
}
cout << last << endl;
}
return 0;
}
1 1不能放2个1,要变成width为2的1,然后这样算下去就对