CodeForces - 1370E Binary Subsequence Rotation(思维)
題目鏈接:點(diǎn)擊查看
題目大意:給出一個只由 0 或 1 組成的字符串 s ,和一個字符串 t ,問 s 至少需要操作多少次,才能變?yōu)?t,每次操作是:可以選擇字符串 s 中的一個子序列,使得他們?nèi)肯蛴乙苿右粋€單位,如:,選擇的子序列為位置,經(jīng)過操作后 s 就變?yōu)榱?
題目分析:很顯然的兩個結(jié)論是,如果字符串 s 和字符串 t 中 1 的數(shù)量或者 0 的數(shù)量不相等,那么輸出 -1 ,還有一點(diǎn)就是,如果字符串 s 和字符串 t 中的某一位置 s[ i ] == t[ i ] ,則這個位置無需操作,可以視為被刪除就好了
接下來考慮貪心,子序列的長度肯定得大于等于?2 ,稍微舉舉例子不難發(fā)現(xiàn),每次操作只能選擇偶數(shù)串的 0101... 或者 1010...,舉個反例就是,如果選擇的 s 為 011,那么經(jīng)過操作后變?yōu)榱?101,第三個位置沒有變化,所以選不選第三個位置沒有影響,同理得出每次只能選擇偶數(shù)個的 01 交替的子序列進(jìn)行操作才是具有貢獻(xiàn)的
然后貪心放,就拿和為例,此時已經(jīng)將所有 s[ i ] == t[ i ] 的位置都刪除掉了,從 1 ~ n 遍歷一遍字符串,當(dāng)遍歷到第一個位置時,s[ 1 ] == 1 ,所以 ans++ ,另外這里有一個單獨(dú)的 1,到了第二個位置時,s[ 2 ] == 1,所以仍然讓 ans++,此時有兩個單獨(dú)的 1 ,到了第三個位置,此時 s[ 3 ] == 0 ,因?yàn)榍懊嬉呀?jīng)有兩個單獨(dú)的 1 了,所以我們貪心讓這個 0?與第一個 1 匹配,此時 ans 不變,我們有一個 “10” 串和一個 “1” 串,到了第四個位置,此時 s[ 4?] == 1 ,因?yàn)榇藭r第一個串中可以接一個 1 了,所以我們就可以直接將當(dāng)前的 1 與 “10” 匹配,此時有一個 “101” 串和一個 “1” 串,剩下的兩個位置都是 0 ,我們直接讓其與兩個串匹配即可,即最后的兩次操作分為 “1010” 和 “10” ,答案為 2 是最優(yōu)的
再看一個例子,這樣我就只給出字符串 s 了,如果,按照上面的貪心,當(dāng)匹配完前三個位置后,我們得到了兩個串:“10” 和 “0” ,到了第四個串的 s[ 4 ] == 1,按理說和第一個串或者第二個串都是可以匹配的,但是我們發(fā)現(xiàn)如果和第一個串匹配的話,最后就無法形成偶數(shù)個 1010... 了,所以此時應(yīng)該選擇其與第二個串匹配
知道原理后 O( n ) 去模擬就好了
代碼:
?
?
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的CodeForces - 1370E Binary Subsequence Rotation(思维)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 1370D O
- 下一篇: CodeForces - 1370F2