水面下の夢

競プロやイラストに興味があります.メインブログがここ.ソシャゲの話はこっち(http://ameblo.jp/0n0-yumechi/).ブログアイコンはYaQ(@8_9_00)さんから.

ABC029 D - 1

回答

D: 1 - AtCoder Beginner Contest 029 | AtCoder


解けなかったので解説の通り実装.
ちなみにここ数回のD問題はある程度解けていただけに,残念.

2015 を考えた際に,
0001 が現れるのは, 2015 // 10
0010 が現れるのは, 2015 // 100 * 10
0100 が現れるのは, 2015 // 1000 * 100
のように求められるので,とりあえずこれを足し合わせる.(処理1)

次に,次のようなパターンを足し合わせるために計算.(処理2)
以下の例では二桁の場合を想定する.
15 を考えた時に,カウントするべきは10, 11, 12, 13, 14, 15の6回分あるので,100の剰余を取った時の値を確認する必要がある.これが20以上であれば,全てカウントすれば良いので,そのまま10を足す.仮に9など,10に満たない場合は,足し合わせない.
これをかく桁に対して行う.

ということで,if文のところの処理が必要なわけです.



コンテスト中に適当に考えていたアルゴリズムとほぼ近いような形で回答が準備されていたので,少し悔しい反面,実装能力のなさを実感させられるのであった.ぐぬぬ

    n = int(input())
    res = 0
    for i in range(len(str(n))):
        nowdigit = 10 ** (i + 1)
        partnum = n % nowdigit
        partdigit = 10 ** i
     
        # 処理1
        res += n // nowdigit * partdigit
        
        # 処理2
        if partnum >= 2 * partdigit:
            res += partdigit
        elif 2 * partdigit > partnum >= partdigit:
            res += partnum - partdigit + 1
    print(res)