9 2練習題7 01字串的交叉安排 題解

2022-08-19 21:54:12 字數 1359 閱讀 9897

題目出處: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
樣例輸出1
011
樣例輸入2
2 2
樣例輸出2
0101
樣例輸入3
3 2
樣例輸出3
01010
樣例輸入4
4 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...