hdu1506(1505前置)

题目: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:1
2

然后
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,然后这样算下去就对

猜你喜欢

转载自blog.csdn.net/weixin_44003016/article/details/86756655
今日推荐