補丁陣列證明

2021-10-07 15:52:35 字數 1195 閱讀 4569

補丁陣列的證明比最多能完成排序的塊要好講多了(/ω\)

上**

#include

#include

using

namespace std;

const

int maxn =

1e5+5;

int l, n;

int a[maxn]

;int

main()

sum +

= a[i];}

while

(sum < n)

printf

("%d"

, ans)

;return0;

}

(一).當sum >= a[i] - 1時

則[0 , a[i] - 1]都可以被組成,那麼用上a[i]後,可以組成的範圍為

[0 , sum + a[i]]
原因:因為[0 , a[i] - 1]都可以被組成,那麼在所有方案都用上a[i]後,可以組成的範圍為[a[i] , sum + a[i]],可是[0, a[i] - 1]也能被組成啊。所以組成的範圍就為[0, sum + a[i]]了

(二).當sum < a[i] - 1時

我們則必須要讓能組成的數(即sum) >= a[i] - 1,成為第一種情況

(因為題目中說了是有序的數列,所以用上了後面的,是無法影響[sum, a[i] - 1]的,因為a[j] > a[i] - 1(j > i),所以我們必須在面對 困難 a[i]時,[1, a[i] - 1]必須組成)

為了使sum >= a[i] - 1,我們就得新增補丁

重點

補丁添多大???

要求:增添了補丁後,能滿足湊出的最大的數要盡量大,且比ta小的數,一定能被湊出來。

(1).若補丁大於sum + 1了

則sum + 1是無法被湊成的(易證)

不滿足要求

(2).若補丁等於sum + 1

由(一)可知,是能滿足要求的,且現在的能湊出的數的範圍變為

[1, sum * 2 + 1]
(3).若補丁小於sum + 1

最後的範圍一定沒有(2)大,所以不用考慮

綜上所述:補丁最優的方法是:補充sum + 1

補丁陣列證明

補丁陣列的證明比最多能完成排序的塊要好講多了 上 include include using namespace std const int maxn 1e5 5 int l,n int a maxn int main sum a i while sum n printf d ans return0...

字尾陣列模板 LCP小證明

複習了一遍字尾陣列 關於lcp的證明 簡單的說下 設p min height k ilcp i,j p,顯然lcp i,j p 排名越相近,字首越可能相同 假設lcp i,j tp。則字串sa i 和字串sa j 前tp位相同。從sa i 到sa j 之間的字串一定是從sa i 到sa j 字典序遞...

diff製作補丁和patch打補丁

1 製作補丁 製作補丁使用diff命令 假設原始檔為 wx srcdir bak 目標檔案為 tmp new1 new2 srcdir 目標檔案是在原始檔基礎上的更新,更新之後想產生乙個補丁檔案。所謂補丁檔案,就是記錄下這兩個檔案的 異同。補丁檔案作用 公升級和備份。想做個備份為v1版本。如果把整個...