奇技淫巧 盛水最多的容器

2021-10-08 13:46:01 字數 1920 閱讀 6221

給你 n 個非負整數 a1,a2,…,an,每個數代表座標中的乙個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。

說明:你不能傾斜容器,且 n 的值至少為 2。

圖中垂直線代表輸入陣列 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍色部分)的最大值為 49。

可以理解為三數和的高階版,不過低配我也不會做哈哈哈。但是我相信,二刷的時候我會做。

我們先從題目中的示例開始,一步一步地解釋雙指標演算法的過程。稍後再給出演算法正確性的證明。

題目中的示例為:

[1,

8,6,

2,5,

4,8,

3,7]

在初始時,左右指標分別指向陣列的左右兩端,它們可以容納的水量為 min⁡(1,7)∗8=8\min(1, 7) * 8 = 8min(1,7)∗8=8。

此時我們需要移動乙個指標。移動哪乙個呢?直覺告訴我們,應該移動對應數字較小的那個指標(即此時的左指標)。這是因為,由於容納的水量是由

兩個指標指向的數字中較小值∗指標之間的距離
決定的。如果我們移動數字較大的那個指標,那麼前者「兩個指標指向的數字中較小值」不會增加,後者「指標之間的距離」會減小,那麼這個乘積會減小。因此,我們移動數字較大的那個指標是不合理的。因此,我們移動 數字較小的那個指標。

此時可以容納的水量為 min⁡(6,8)∗4=24。由於左指標對應的數字較小,我們移動左指標,並且可以發現,在這之後左指標對應的數字總是較小,因此我們會一直移動左指標,直到兩個指標重合。在這期間,對應的可以容納的水量為:min⁡(2,8)∗3=6,min⁡(5,8)∗2=10,min⁡(4,8)∗1=4。

在我們移動指標的過程中,計算到的最多可以容納的數量為 494949,即為最終的答案。

其實,再加上哨兵就更好了。

c 的奇技淫巧

關於陣列 數論演算法技巧 stl其他 while scanf d d n,m eof 等價於 while scanf d d n,m 2 前者eof為檔案結束符,較保險 後者 後的數字為輸入的變數的個數 不能只寫while scanf d d n,m 這樣無法結束讀入 wwq大佬教的,希望我不要和他...

Git的奇技淫巧

git常用命令集合,fork於tips專案 git是乙個 分布式版本管理工具 簡單的理解版本管理工具 大家在寫東西的時候都用過 回撤 這個功能,但是回撤只能回撤幾步,假如想要找回我三天之前的修改,光用 回撤 是找不回來的。而 版本管理工具 能記錄每次的修改,只要提交到版本倉庫,你就可以找到之前任何時...

CFD post的奇技淫巧

此處記錄兩個後處理美化的技巧 1 關於contour顯示的美化 2 關於legend的顯示美化 1.直接舉例說明,現在cfd post裡匯入了乙個二維case,先建立乙個plane 然後顯示出來的效果是這樣 很明顯contour的分層感太強,想讓顯示效果更均勻怎麼辦。改 of contours,改成...