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,然後這樣算下去就對

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章