2.Atcoder Grand Contest21 Digit Sum 2
A - Digit Sum 2
問題文
N 以下の正の整数の 10 進法での各桁の和の最大値を求めてください。
制約
- 1≤N≤1016
- N は整数である
自力では分からなかったので、正解者のコードを見て考察。
Nの条件から、全探索は不可能。
ですが、そもそも探索する必要がありません。
何故かというとN以下の正の整数の各桁の和が最大になるときは必ず、
・6999
・9
・89
・2999
先頭、一番左の桁以外が9になるからです。
0~9の整数の中で一番大きいのは9ですから当然ですね。
つまり、この問題は
1.桁の数 - 1 回合計に9を足す
2.先頭の桁の数字を合計に足す
という操作だけで十分そうです。
ですが、例えばN = 7000 のとき。
7000以下で各桁の和が最大値を取るのは、6999のとき、33です。
しかし、上の1、2の操作を行うと 9 + 9 + 9 + 7 = 34 となってしまいます。
ではどうやって解決するか。例を出して見ていきます。
N = 6997の時、各桁の和が最大値を取るのは 5999の時 32。
N = 5879の時、各桁の和が最大値を取るのは 4999の時 31。
N = 3279の時、各桁の和が最大値を取るのは 2999の時 29。
N = 114514の時、各桁の和が最大値を取るのは 99999の時 45。
規則性が見えてきたと思います。どれも最大値を取るのは 下N -1桁 が 9 の時。
そして、先頭桁の数が、-1 されています。
ここから、
1.桁の数 - 1 回合計に9を足す
2.先頭の桁の数字 - 1 を合計に足す
この二つの操作で求められそうです。
ちょっとまって!
それじゃ6999とか4999とか最初から先頭以外9の数字だとおかしくなるじゃん!
と思う方はちゃんと解き方を理解できています。
そうです。先の二つの操作だと、6999のときに、5999の各桁を足してしまいます。
ならばどうすればよいかと言うと
6999などの最初から先頭以外9の数字を存在できなくすればいいだけです。
は?と思うかもしれませんが理屈は簡単です。
1を足して繰り上げてしまえばいいのです。
7688でも、7933でも最大値をを取るのは6999の時だけです。別に1を足したくらいじゃに何も変わりません。
対して、6999に1を足せば7000です。
そして、7000の桁は4桁なので9+9+9
7から1を引いて6。
合計で33です。 少し戻って確認してみてください。6999の時は33です。
なにも変わらないですね。
最終的に、問題を解くために必要な工程は3つ。
1.N に 1を足す
2.Nの桁数 - 1回合計に9を足す。
3.合計に先頭の数 - 1を足す。
これで、この問題は解決です。