はまやんはまやんはまやん

hamayanhamayan's blog

ちらし寿司 [いろはちゃんコンテスト Day1 H]

https://atcoder.jp/contests/iroha2019-day1/tasks/iroha2019_day1_h

解説

https://atcoder.jp/contests/iroha2019-day1/submissions/5195896

基本方針は19999や299のように、

  • なるべく桁数を少なくするために9でまとめる
  • 余りは先頭に置く

として作っていけばいい。
ただ、X≠Nという条件があるので、X=Nとなった場合にはうまく回避する必要がある。
基本的には199999であれば、2899999のように最上位の桁にその下を桁から1つ分持ってくればいい。
全部9であれば、繰り上がりで999→1899のようにするし、
一桁の場合もうまく場合分けすることでACできる。

ll N;
//---------------------------------------------------------------------------------------------------
void _main() {
	cin >> N;
 
	ll bak = N;
 
	int sm = 0;
	while (0 < N) {
		sm += N % 10;
		N /= 10;
	}
 
	string ans = "";
	while (0 < sm) {
		if (9 <= sm) ans = to_string(9) + ans, sm -= 9;
		else ans = to_string(sm) + ans, sm = 0;
	}
 
	if (to_string(bak) == ans) {
		if (ans[0] == '9') {
			ans = "18" + ans.substr(1);
		}
		else {
			if (ans.size() == 1) {
				ans[0]--;
				ans = "1" + ans;
			}
			else {
				ans[0]++;
				ans[1]--;
			}
			
		}
	}
 
	cout << ans << endl;
}