くれなゐの雑記

例を上げて 自分で手を動かして学習できる入門記事を多めに書いています

CODE FESTIVAL 2016 qual A. C - 次のアルファベット / Next Letter

解き方

この操作をして, 辞書順を小さくするためには, 'b'より大きいものを一周させて'a'にする以外ない.

辞書順最小にするためには, 手前から見ていって, 'a'にできるものは'a'にして, それ以外は無視する と言った処理をすればよい.

この処理は, K 回必ず行わなければならないので, 余ったやつも必ず処理をしなければならない。

まず, アルファベットを何周もさせることができるので, 残ったやつから'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;
}