補丁陣列的證明比最多能完成排序的塊要好講多了(/ω\)
上**
#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版本。如果把整個...