題目連結: https://zerojudge.tw/ShowProblem?problemid=c907

# 解題思路

每讀入一個數字,如果數字比前一個大就加入堆疊,比堆疊頂端的長度小,移除頂端元素並計算面積,並把現在的矩形放入堆疊,但是位置要存最後一個移除掉的矩形之位置
最後記得清空堆疊,即可求得解。
(好像可以用 stack 解這題ㄟ)
思維參考自: https://home.gamer.com.tw/creationDetail.php?sn=4234008

# 程式碼

#include <iostream>
using namespace std;
int main() {
	cin.sync_with_stdio(false), cin.tie(0), cout.tie(0);
	int n, xs[10000], ys[10000]; 
    int pr, tmp, area, maxx; //pr: 最後一個位置
	cin >> n, pr = maxx = 0;
	for (int i = 0, j; i < n; i++) { 
		cin >> tmp, j = i;
		while (pr && tmp < ys[pr - 1]) { // 處理比新增更高的位置
			pr--;
			area = (i - xs[pr]) * ys[pr];
			if (area > maxx)
				maxx = area;
			j = xs[pr];
		}
		if (!pr || tmp > ys[pr - 1]) // 往上堆疊
			ys[pr] = tmp, xs[pr] = j, pr++;
	}
	while (pr) {
		pr--;
		area = (n - xs[pr]) * ys[pr];
		if (area > maxx)
			maxx = area;
	}
	cout << maxx << '\n';
}
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay