題目出處:codeforces 401c
題目描述
你有 \(n(1 \le n \le 10^6)\) 個字元『0』 和 \(m(1 \le m \le 10^6)\) 個字元『1』。你需要使用這些字元拼接成乙個01字串,使得滿足如下兩個條件:
字串中不能出現連續的兩個『0』;
字串中不能出現連續的三個『1』。
請問這樣的字串能夠拼接出來。
如果不存在這樣的拼接方案,輸出「-1」;否則,輸出所有拼接方案中字典序最小的方案。
比如,如果 \(n=1,m=2\) ,此時可選的方案有「011」、「101」、「110」,其中字典序最小的方案是「011」,所以輸出「011」。
輸入格式
輸入一行包含兩個正數 \(n\) 和 \(m(1 \le n,m \le 10^6)\) ,以乙個空格分隔,分別用於表示字元『0』和『1』出現的次數。
輸出格式
如果不存在合法的拼接方案,輸出「-1」;否則,輸出字典序最小的拼接結果。
樣例輸入1
1 2
樣例輸出1011
樣例輸入22 2
樣例輸出20101
樣例輸入33 2
樣例輸出301010
樣例輸入44 2
樣例輸出4-1
題目分析
首先,在 \(n\) 已經確定的情況下, \(m\) 的取值範圍是:
所以,入門滿足 \(n-1 \le m \le 2 \times (n+1)\) 的條件,我們才能繼續判斷;如果不滿足這個條件,說明沒有結果,輸出「-1」即可結束。
在存在解的情況下,首先我們要判斷 \(m \gt 2 \times n\) 是否成立,如果成立的話所有最前面的那個『0』前面有 \(m - 2 \times n\) 個 『1』,需要先輸出這幾個『1』。然後我們每次去判斷 \(m == 2 \times n\) 是否成立,如果成立則輸出「011」,m -=2; n--; 否則,輸出「01」, m--,n--; 當然我們要注意,在最後乙個『0』後面可能沒有『1』了,所以還需要判斷一下當前的m是否已經等於0了,如果 \(m = 0\) ,則說明最後乙個『0』後面沒有『1』,則最後乙個『0』後面不需要輸出『1』。
實現**如下:
#include using namespace std;
int n, m;
int main()
while (n)
}else
return 0;
}
練習題3 字串解碼
原題目 給定乙個經過編碼的字串,返回它解碼後的字串。編碼規則為 k encoded string 表示其中方括號內部的 encoded string 正好重複 k 次。注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原...
第七周 字串練習題
例題1 輸入一行字元,統計出其中數字字元的個數。輸入 一行字串,總長度不超過255。輸出 輸出為1行,輸出字串裡面數字字元的個數。樣例輸入 peking university is set up at 1898.樣例輸出 4 include include include include inclu...
字串練習題
1.請編寫乙個c函式,該函式可以實現將乙個整數轉為任意進製的字串輸出 include include char ch 16 函式宣告 將整數轉換為任意進製的字串 charchar int2sys int num,int n,int move bit int main else if n 8 else...