TopCoder SRM 394 Div1 Easy RoughStrings
問題
文字列sのroughnessとは、
sに出現する文字のうち、最も多いものの出現回数をa、
最も少ないもの(ただし一回以上出現するもの)の出現回数をbとしたとき、
a-bで定義される。
与えられた文字列からn個以下の文字を消して得られる文字のうち、
roughness最小となるような文字列の、roughnessの最小値を求めよ。
制約条件
sの長さ≦50
n≦50
方針
その時点で出現回数が多い文字をi個、出現回数が少ない文字をj個消す、
という操作をすべての0≦i+j≦nについて試す。
ソースコード
int calc(vi cnt,int a,int b){ rep(i,cnt.size())if(cnt[i]==0)cnt.erase(cnt.begin()+i--); rep(i,a){ int p=max_element(all(cnt))-cnt.begin(); cnt[p]=max(cnt[p]-1,0); } rep(it,b){ int p=min_element(all(cnt))-cnt.begin(); cnt[p]=max(cnt[p]-1,0); rep(i,cnt.size())if(cnt[i]==0)cnt.erase(cnt.begin()+i--); } if(cnt.empty())cnt.pb(0); return *max_element(all(cnt))-*min_element(all(cnt)); } class RoughStrings { public: int minRoughness(string s, int n) { vi cnt(26); rep(i,s.size())cnt[s[i]-'a']++; int ans=inf; rep(i,n+1)rep(j,n-i+1)ans=min(ans,calc(cnt,i,j)); return ans; } };