-
題目描述
現在有一條筆直的水槽,裏面有N塊擋板。你需要從中選取兩塊擋板,使得能夠獲取最多的水容量。
-
輸入
測試數據由多組輸入樣例組成
第一行輸入一個整數N,( 2 <= N <= 20000 )
第二行輸入N個整數 ni ( 0 <= ni <= 10000),分別代表擋板的高度 -
輸出
輸出能夠獲取的最多水容量 -
樣例輸入
-
9
1 8 6 2 5 4 8 3 7 -
樣例輸出
49
-
題解思路
1.暴力法(過於簡單不多贅述)
2.雙指針法
這種方法背後的思路在於,兩線段之間形成的區域總是會受到其中
較短那條長度的限制。此外,兩線段距離越遠,得到的面積就越
大。
我們在由線段長度構成的數組中使用兩個指針,一個放在開始,一
個置於末尾。 此外,我們會使用變量 maxarea 來持續存儲到目前
爲止所獲得的最大面積。 在每一步中,我們會找出指針所指向的兩
條線段形成的區域,更新 maxarea ,並將指向較短線段的指針向較
長線段那端移動一步。
查看下面的例子將有助於你更好地理解該算法:
雙指針代碼
#include <bits/stdc++.h>
using namespace std;
int k[20005];
int main()
{
ios::sync_with_stdio(false);
int n, a, b;
while(cin >> n)
{
int maxs = 0; // 初始化最大面積
a = 0, b = n - 1; // 雙指針初始值分別爲開頭結尾
for(int i = 0; i < n; i++)
cin >> k[i];
while(b - a)
{
maxs = max(maxs, (b - a) * min(k[a], k[b])); // 每次更新最大面積
//短邊向長邊移動
if(k[a] <= k[b])
a++;
else
b--;
}
cout << maxs << endl;
}
return 0;
}