1418 放球遊戲
基準時間限制:1 秒 空間限制:131072 kb 分值: 20 難度:3級演算法題 收藏 關注
有n個球排成一排,每個球都是r、g、b三種顏色之一。現在想重新排列這一排球,你要重複以下過程n次:
1)從原來的那排球中的最左側取出乙個球;
2)將取出的求插入新的球排列的任意位置,即可以放在最左或最右端,也可以插入那排球的任意兩個相鄰球之間;
3)計算這輪得分,如果是第乙個球那麼得0分;如果放在兩端(最左或最右端)得分為除了新放入的球外,剩餘球的顏色種數;如果放在兩個球之間,那麼得分為這個新放入的球左側所有球的顏色種數與這個球右側所有球的顏色種數的和。(解釋一下「顏色種數」:一堆球裡出現的不同顏色個數,對應這裡的得分就是一種顏色得一分,多個球同色只算一次得分。)
那麼在最優操作下,最多能得到的總分是多少?
input
多組測試資料,第一行乙個整數t,表示測試資料數量,1
<=t<=5
每組測試資料有相同的結構構成:
每組資料一行,只有乙個有『r』,『g』,『b』三個字元構成的字串s,表示原始的球排列。其中,s包含字元個數不超過50,且無空串。
output
每組資料一行輸出,即最大的總得分。
input示例
3rgb
rggrbbb
rrrgbrr
output示例321
16
感覺每次做51nod都要腦洞大開….
顯然 每次插入乙個球 都要保證插入位置2邊的球顏色種類數盡可能多
假設有2個堆
考慮插入x色球
如果哪個堆沒有顏色為x的球 就插進哪個堆
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include
using
namespace
std;
#define ll long long
#define ull unsigned long long
#define pii pair
#define inf 1000000007
#define pll pair
#define pid pair
struct c;
int score=0;//可以獲得的分數(顏色種數)
void add(char ch)
bool check(char ch)
};int slove(char*s)
else
if(!c2.check(s[i]))
}return ans;
}int main()
return
0;}
51Nod 1418 放球遊戲
acm模版 一道模擬題,ac率之高,令人髮指,但是並不是說明這道題很水,畢竟a它的人數基數不大。這裡根據題意,需要額外考慮的是當球的個數是1個或者2個時,結果分別是0和1,然後,就需要考慮球放的位置了,當然,這其實是乙個煙霧彈,我們只需要每次都盡量往中間放,使兩邊的球色最雜,這時,就要考慮到每種顏色...
nod 1418 放球遊戲
有n個球排成一排,每個球都是r g b三種顏色之一。現在想重新排列這一排球,你要重複以下過程n次 1 從原來的那排球中的最左側取出乙個球 2 將取出的求插入新的球排列的任意位置,即可以放在最左或最右端,也可以插入那排球的任意兩個相鄰球之間 3 計算這輪得分,如果是第乙個球那麼得0分 如果放在兩端 最...
51nod 貪心入門
有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...