hirohirohirohirosのブログ

地方国立大学に通う情報系学部4年

Atcoder 灰diff埋め AGC002~AGC024 振り返り

AGC021 A - Digit Sum 2【AC】

 N 以下の正の整数の10進法での各桁の和の最大値を求める問題でした.0からN順に各桁の和を求めていって最大値を出す方法では,N<10^16であるため間に合いません.
 総和の最大値なので,単純に考えると沢山9がある数字が最大値のように思います.実際にこれは正しく,例えばN=555なら,499が最大になります.これは各桁を9に変換し,N以下である必要があるため1桁目を-1する操作と言えます.555なら1桁目の5を4にし,それ以外の5を9に変換してます.
 これでACかと思いきや例外がありWAです.N=5などNが1桁だった場合です.この方法だとN=4となってしまいます.よってNの各桁の総和と上記処理をした総和の大きい方を出力すればACになります.

N = list(map(int, list(input())))
print(max(N[0]-1 + 9*(len(N)-1), sum(N)))