度度熊有一張紙條和一把剪刀。
紙條上依次寫著 n 個數字,數字只可能是 0 或者 1。
度度熊想在紙條上剪 k 刀(每一刀只能剪在數字和數字之間),這樣就形成了 k+1 段。
他再把這 k+1 段按一定的順序重新拼起來。
不同的剪和接的方案,可能會得到不同的結果。
度度熊好奇的是,字首 1 的數量最多能是多少。
有多組資料,讀到eof結束。
對於每一組資料,第一行讀入兩個數 nn 和 kk 。
第二行有乙個長度為 n 的字串,依次表示初始時紙條上的 n 個數。
0≤k所有資料 nn 的總和不超過100000
對於每一組資料,輸出乙個數,表示可能的最大字首 11 的數量。
5 1
11010
5 211010
2
3
比如這個 1001100011
我們剪開:1 00 11 000 11
拼起來 1111100000 字首1的數量是 5,這是題目的意思。
顯然的:
1.若第乙個或最後乙個是1,一次就能剪下第一段或最後一段。
2.中間的片段用兩刀剪下。
假如有n個1片段,我們已經剪下了n-1,剩下的那個片段可以帶著0,只露出一邊1即可,也就是他的代價-1。
但我們不知道具體是那個片段。
那我們乾脆k++就得了。
這個問題就可以轉化成01揹包了,每段1的個數為價值,剪的次數為體積
#include#include#includeusing namespace std;
const int maxn = 100005;
int n, k, w[maxn], dp[maxn], v[maxn];
char s[maxn];
int main()
k++;
if(s[1] == '1') v[1] = 1;
if(s[n] == '1') v[tot] = 1;//這兩種情況特判
if(k == 1)
for(int i=1; i<=tot; i++)
}printf("%d\n", dp[k]);
}return 0;
}
百度之星初賽C hdu 6376 度度熊剪紙條
度度熊有一張紙條和一把剪刀。紙條上依次寫著 n 個數字,數字只可能是 0 或者 1。度度熊想在紙條上剪 k 刀 每一刀只能剪在數字和數字之間 這樣就形成了 k 1 段。他再把這 k 1 段按一定的順序重新拼起來。不同的剪和接的方案,可能會得到不同的結果。度度熊好奇的是,字首 1 的數量最多能是多少。...
度度熊剪紙條
ps 改了這麼久,對拍一下就找到錯誤了。貪心,首部出現的1,是不用去剪的,所以當作特殊元素考慮,因此當 k 0的時候 或者 k沒有用完的時候一定要考慮是否用到了首部那一節 cntst 而尾部只需要剪一次,中間的部分需要減兩次,貪心的時候要分別討論 有史以來寫得最醜的 inline bool cmp ...
2018百度之星(A)度度熊剪紙條
度度熊有一張紙條和一把剪刀。紙條上依次寫著 n 個數字,數字只可能是 0 或者 1 度度熊想在紙條上剪 k 刀 每一刀只能剪在數字和數字之間 這樣就形成了 k 1 段。他再把這 k 1 段按一定的順序重新拼起來。不同的剪和接的方案,可能會得到不同的結果。度度熊好奇的是,字首 1 的數量最多能是多少。...