hdu6376 度度熊剪紙條

2022-03-20 01:29:37 字數 1158 閱讀 5428

度度熊有一張紙條和一把剪刀。

紙條上依次寫著 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 的數量最多能是多少。...