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;
  }
};