nod 1418 放球遊戲

2021-07-11 06:00:54 字數 1754 閱讀 6221

有n個球排成一排,每個球都是r、g、b三種顏色之一。現在想重新排列這一排球,你要重複以下過程n次:

1)從原來的那排球中的最左側取出乙個球;

2)將取出的求插入新的球排列的任意位置,即可以放在最左或最右端,也可以插入那排球的任意兩個相鄰球之間;

3)計算這輪得分,如果是第乙個球那麼得0分;如果放在兩端(最左或最右端)得分為除了新放入的球外,剩餘球的顏色種數;如果放在兩個球之間,那麼得分為這個新放入的球左側所有球的顏色種數與這個球右側所有球的顏色種數的和。(解釋一下「顏色種數」:一堆球裡出現的不同顏色個數,對應這裡的得分就是一種顏色得一分,多個球同色只算一次得分。)

那麼在最優操作下,最多能得到的總分是多少?

input

多組測試資料,第一行乙個整數t,表示測試資料數量,1<=t<=5

每組測試資料有相同的結構構成:

每組資料一行,只有乙個有『r』,『g』,『b』三個字元構成的字串s,表示原始的球排列。其中,s包含字元個數不超過50,且無空串。

output

每組資料一行輸出,即最大的總得分。
input示例

3

rgbrggrbbb

rrrgbrr

output示例

3

2116

題目前3遍沒讀懂,總覺得不對勁,樣例也理解不了。

第四遍認真研究了一下,發現漏了個細節「

將取出的求插入

新的球排列的任意位置

」,注意是新的排列,而不是在老排列裡面插,舉例說明:

rgb,依次取第乙個可以認為放到乙個空的地方

r---第乙個得分0

rg/gr----得分都是1(放在r頭或者尾)

rgb/grb/bgr/brg----得分都是2(放在兩頭或者插入中間)

好題目讀懂了。

考慮怎麼做,首先假設前面已經有幾個了,現在來了乙個,該如何放才能得分最大,明顯不能放兩端,放在中間至少可以把兩個相同的分開,這樣得分至少多得一分,比如grrb,放在兩端只有3分,放中間最少3分,最多4分,所以放在兩端感覺是迷惑人的。

然後就想模擬一下,看能不能找到規律:

第乙個無論是啥都是0分

第二個來了,無論第乙個是啥都是得一分

第三個來了,前兩個無論是啥都是得2分

。。。。

最多得6分,也就是至少前面已經有2個g,2個b,2個r時,並且再多也無用了,那實際上大於2就按2計算就行了;這麼一考慮,3中顏色,每個取值0-2,也就那麼幾種情況,就試著寫了寫,沒想到發現了點規律:

2 2 2 再來一球插入最多得6分

2 2 1 再來得5分

1 1 2

2 2 0  得4分

2 0 1

1 1 1 得3分

0 0 2

1 0 1得2分

1 0 0得1分

0 0 0 得0分

再一看,只要大於2按照2算,這三個數之和剛好和得分一樣,其實也就不用區分rgb了;

後來考慮了一下 3 0 0會不會出問題,發現3 0 0 最多也是2分,和2 0 0 一樣

然後就出來下面**了:

#include#includeusing namespace std;

int main()

{ int t;

cin >> t;

string str;

while(t --)

{cin >> str;

if (str.length() < 3)

{cout << str.length() - 1<

141,整數型別

int,float,double,bool,character,string array,dictionary,元組型別 tuple 可選型別 optional 資料型別的首字母是大寫的 在變數名後面加冒號 和資料型別 var age int 10 一般,沒有必須明確指定變數和常量的型別。如果在宣告...

141 長按鍵入

題目描述 你的朋友正在使用鍵盤輸入他的名字 name。偶爾,在鍵入字元 c 時,按鍵可能會被長按,而字元可能被輸入 1 次或多次。你將會檢查鍵盤輸入的字元 typed。如果它對應的可能是你的朋友的名字 其中一些字元可能被長按 那麼就返回 true。示例 1 輸入 name alex typed aa...

解除安裝qemu 1 4 1

由於通過原始碼安裝的qemu沒有辦法通過系統工具進行解除安裝,也沒有辦法通過make uninstall方法解除安裝,所以只能通過刪除檔案的方式進行解除安裝。qemu可執行檔案預設放在 usr local bin,庫檔案預設放在 usr local libexec,配置檔案預設放在 usr loca...