CODE FESTIVAL 2016 qual A. C - 次のアルファベット / Next Letter
解き方
この操作をして, 辞書順を小さくするためには, 'b'より大きいものを一周させて'a'にする以外ない.
辞書順最小にするためには, 手前から見ていって, 'a'にできるものは'a'にして, それ以外は無視する と言った処理をすればよい.
この処理は, 回必ず行わなければならないので, 余ったやつも必ず処理をしなければならない。
まず, アルファベットを何周もさせることができるので, 残ったやつから'z'-'a'+1分だけMODを取った値にすることができる.
さらに残ったものは, 後ろから回していく.(後ろの1文字だけ変更になるはず)
SourceCode
void solve() { string S = in(); ll K = in(); REP(i, S.size()) { if (K <= 0) break; ll cost = 'z' - S[i] + 1; cost %= ('z' - 'a' + 1); if (K - cost >= 0) { S[i] = 'a'; K -= cost; } } if(K > 0) K %= ('z' - 'a' + 1); RFOR(i,0,S.size()) { if (K <= 0) break; ll cost = min((ll)K, (ll)('z' - S[i])); S[i] += cost; K -= cost; } cout << S << endl; }