日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

鸭子唱歌-贪心

發(fā)布時間:2024/3/13 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 鸭子唱歌-贪心 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目描述

小明的樓下出現(xiàn)了許多鴨子,一開始只有一只鴨子在唱歌,“quack……quack……quack……”,小明覺得還挺好聽的。緊接著,所有鴨子都一起唱了起來。小明開始厭煩了,他想要知道到底有多少只鴨子在他家樓下。
由于鴨子們邊唱邊跳,小明數(shù)著數(shù)著就數(shù)不清楚了。因此他想到了一個辦法,把鴨子的聲音錄下來,用計算機(jī)來進(jìn)行分析。一只鴨子發(fā)出的聲音,只能是“quack”唱完整的一遍或者連續(xù)多遍,但是不同鴨子的聲音會疊加,同一個微小的時刻就只有1只鴨子發(fā)出一個聲音。例如:“ququaackck”就是由兩只鴨子的聲音疊加而成的,第一只是“qu___ack”,第二只是“__qua___ck”;又例如,“quackquack”這段聲音,可能是1只鴨子,也可能是2只鴨子發(fā)出的。如果小明獲取的聲音是類似“quakc”不是由“quack”重復(fù)構(gòu)成,或者只是其中一部分,這樣的聲音就是不規(guī)則,無效的。
現(xiàn)在,小明記錄下了一段時間內(nèi)鴨子的聲音,問,這段聲音中最少包含多少只鴨子?

輸入

輸入只有一行,一個字符串表示鴨子的聲音。字符串中只包含“q”,“u”,“a”,“c”,“k”這5種小寫字母。

輸出

輸出最少包含鴨子數(shù)量。若小明的聲音錄制無效,輸出-1。

樣例輸入

【樣例1】

quqacukqauackck

【樣例2】

quackquakc

【樣例3】

qqqqqqqqqquuuuuuuuuuaaaaaaaaaacccccccccckkkkkkkkkk

樣例輸出

【樣例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ù),鴨子的聲音長度不超過200
70%的數(shù)據(jù),鴨子的聲音長度不超過1000
100%的數(shù)據(jù),鴨子的聲音長度不超過2500

tag:瞎貪心

要找到最小的鴨子數(shù)量,首先可以考慮貪心一下
貪心策略:

  • 首先將不符合條件的情況給特判掉:
    長度 % 5 != 0應(yīng)該直接輸出-1
    并且還要使得三種字符的數(shù)量保持相等才可以
  • 剩下的策略:要有一只鴨子盡可能多的發(fā)出quack 來才是最優(yōu)的,所以說我們在選擇字符的過程中,選擇里該字符最近的下一個字符,這樣后面的字符就會盡可能靠前,當(dāng)一個完整的單詞出現(xiàn)過之后,再次選擇第一個字母q 的時候,要盡可能選擇之前k 后面的q,這樣會使得鴨子的數(shù)量盡可能少,答案就不用+1,但是沒有辦法找到k后面的q的情況下,就應(yīng)該選擇最前面的q,這樣一來,對答案的貢獻(xiàn)+1
  • 還有以下小細(xì)節(jié),比如說在最后一輪中發(fā)現(xiàn)了最后的k在c前面,那就是不合法的情況,如果最終所有的字母仍有剩余,就是-1的情況
  • Code:(又臭又長,可以換種方法 模擬一下)

    int n,m,k; ll ans; string s; int b[maxn]; map<char,int> mp; set<int> stq,stu,sta,stc,stk; int judge(){int sum = stq.size()+stu.size()+sta.size()+stc.size()+stk.size();return sum; } int main() {cin >> s;int len = s.size();s = " " + s;if(len % 5) {puts("-1");return 0;}int aver = len / 5;for(int i=1; i<=len; i++) {if(s[i] == 'q') stq.insert(i);else if(s[i] == 'u') stu.insert(i);else if(s[i] == 'a') sta.insert(i);else if(s[i] == 'c') stc.insert(i);else if(s[i] == 'k') stk.insert(i);}if(stq.size() != aver || stu.size() != aver || sta.size() != aver || stc.size() != aver || stk.size() != aver){puts("-1");return 0;}int cnt = 1;int pre = 0;int q,u,a,c;while(stq.size()){if(*stq.rbegin() < pre) q = *stq.begin(),stq.erase(stq.begin()),cnt++;else q = *stq.lower_bound(pre),stq.erase(stq.lower_bound(pre));//if(q < pre) cnt ++;if(*stu.rbegin() < q){puts("-1");return 0;}u = *stu.lower_bound(q);stu.erase(stu.lower_bound(q));// printf("u: %d \n",u);if(*sta.rbegin() < u){puts("-1");return 0;}a = *sta.lower_bound(u);sta.erase(sta.lower_bound(u));// printf("a: %d \n",a);if(*stc.rbegin() < a){puts("-1");return 0;}c = *(stc.lower_bound(a));stc.erase(stc.lower_bound(a));// printf("c: %d \n",c);if(*stk.rbegin() < c){puts("-1");return 0;}pre = *(stk.lower_bound(c));stk.erase(stk.lower_bound(c));// printf("%d %d %d %d %d\n",q,u,a,c,pre);}if(judge()) puts("-1");else cout << cnt <<endl;return 0; } /* qqquuuaaaccckkk 3quackquakc -1quackquack 1 */

    總結(jié)

    以上是生活随笔為你收集整理的鸭子唱歌-贪心的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。