ZJYYCOJ 最多水容量(暴力/雙指針)

  • 題目描述
    現在有一條筆直的水槽,裏面有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;
 } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章