问题 L: 鸭子唱歌
Contest2816 - 2021個(gè)人訓(xùn)練賽第10場(chǎng)
問題 L: 鴨子唱歌
題目描述
小明的樓下出現(xiàn)了許多鴨子,一開始只有一只鴨子在唱歌,“quack……quack……quack……”,小明覺得還挺好聽的。緊接著,所有鴨子都一起唱了起來。小明開始厭煩了,他想要知道到底有多少只鴨子在他家樓下。
由于鴨子們邊唱邊跳,小明數(shù)著數(shù)著就數(shù)不清楚了。因此他想到了一個(gè)辦法,把鴨子的聲音錄下來,用計(jì)算機(jī)來進(jìn)行分析。一只鴨子發(fā)出的聲音,只能是“quack”唱完整的一遍或者連續(xù)多遍,但是不同鴨子的聲音會(huì)疊加,同一個(gè)微小的時(shí)刻就只有1只鴨子發(fā)出一個(gè)聲音。例如:“ququaackck”就是由兩只鴨子的聲音疊加而成的,第一只是“qu___ack”,第二只是“qua___ck”;又例如,“quackquack”這段聲音,可能是1只鴨子,也可能是2只鴨子發(fā)出的。如果小明獲取的聲音是類似“quakc”不是由“quack”重復(fù)構(gòu)成,或者只是其中一部分,這樣的聲音就是不規(guī)則,無效的。
現(xiàn)在,小明記錄下了一段時(shí)間內(nèi)鴨子的聲音,問,這段聲音中最少包含多少只鴨子?
輸入
輸入只有一行,一個(gè)字符串表示鴨子的聲音。字符串中只包含“q”,“u”,“a”,“c”,“k”這5種小寫字母。
輸出
輸出最少包含鴨子數(shù)量。若小明的聲音錄制無效,輸出-1。
樣例輸入 Copy
【樣例1】
quqacukqauackck
【樣例2】
quackquakc
【樣例3】
qqqqqqqqqquuuuuuuuuuaaaaaaaaaacccccccccckkkkkkkkkk
樣例輸出 Copy
【樣例1】
2
【樣例2】
-1
【樣例3】
10
提示
樣例1解釋
鴨子1:qu_ac_kq_uack
鴨子2:__q__u__a____ck
聲音最少由2只鴨子構(gòu)成,第一只鴨子唱了2遍,第二只鴨子唱了一遍。
樣例2解釋
不規(guī)則序列,不能由“quack”構(gòu)成
【數(shù)據(jù)范圍】
30%的數(shù)據(jù),鴨子的聲音長(zhǎng)度不超過200
70%的數(shù)據(jù),鴨子的聲音長(zhǎng)度不超過1000
100%的數(shù)據(jù),鴨子的聲音長(zhǎng)度不超過2500
題目解析:一只鴨子叫它必然是按順序的排列,當(dāng)出現(xiàn)第二只鴨子時(shí)就會(huì)有字母穿插在之中間。
解法:找出連續(xù)的quack,當(dāng)中間出現(xiàn)不同的字母開新的空間存儲(chǔ),如果出現(xiàn)的不能成為新的鴨子叫就不能組成輸出-1,同時(shí)不能組完全的也不行輸出-1,最后結(jié)果輸出新開空間數(shù)就是鴨子個(gè)數(shù)。
#include<iostream> using namespace std; char a[10000],c[10000]; int main() {int i,t=0,f,j;cin>>a;for(i=0;a[i];i++)//按順序判斷每一個(gè)字母{f=0;//用來判斷是否被放入數(shù)組中for(j=0;j<t;j++){if(a[i]=='q'&&c[j]=='k'){f=1;c[j]='q';break;}else if(a[i]=='u'&&c[j]=='q'){f=1;c[j]='u';break;}else if(a[i]=='a'&&c[j]=='u'){f=1;c[j]='a';break;}else if(a[i]=='c'&&c[j]=='a'){f=1;c[j]='c';break;}else if(a[i]=='k'&&c[j]=='c'){f=1;c[j]='k';break;}}if(f==0&&a[i]=='q')//只有位q時(shí)才能開新的空間{c[t++]='q';}else if(f==0)//需要開空間但是不是q就不成立{cout<<-1;return 0;}}for(i=0;i<t;i++)//判斷每一個(gè)是否都能完整組成quack{if(c[i]!='k'){cout<<-1;return 0;}}cout<<t;return 0;}總結(jié)
以上是生活随笔為你收集整理的问题 L: 鸭子唱歌的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql字符串处理
- 下一篇: 微信小程序中用户登录和登录态维护