さて1Cも解いていきます。
まだ1問めなので難易度は低め。
http://code.google.com/codejam/contest/32015/dashboard#s=p0
携帯電話風の文字入力において、各アルファベットのキーへの割り当てを変えられる。
各アルファベットの登場回数が与えられたときに、総キー押下回数を最小化する問題。
キーがK個あるので、登場回数の多い最初のK種の文字はキー1回で出せ、次に多いK種は2回で出せ…と割り当てればよい。
結局i番目(0-origin)に多いキーは(1+i/K)回押せばよい。
int P,K,L; int F[1001]; void solve(int _loop) { int i,j,k,l; s64 res = 0; GET3(&P,&K,&L); FOR(i,L) F[i]=GETi(); sort(F,F+L); reverse(F,F+L); FOR(i,L) res += F[i]*(1+i/K); _PE("Case #%d: %lld\n",_loop,res); }
まとめ
STLのsortやreverseは配列にも使えるので楽ですね。