AT274の技術だったりなかったり

あっとのTECH LOG

競プロのこととか技術のこととか。たまに日常を書きます。

DigitalArts 2012 B - Password

問題原文

atcoder.jp

解法

与えられたパスワードと同じものはダメ というのが少し面倒。

2種類正解候補を考えられればどちらかは必ず答えになりうる。

ということで、できるだけ z に近いものを使う場合のパスワードできるだけ a に近いものを使う場合のパスワード を計算した。

実装

ほくほく。

S = input()
P = sum([ord(s) - ord('a') + 1 for s in S])

# できるだけ z に近いものを使うように
cnt = 0
P1 = P
ans1 = []
while P1 and cnt < 20:
    p = min(P1, 26)
    ans1.append(p)
    P1 -= p
    cnt += 1

# できるだけ a に近いものを使うように
cnt = 0
P2 = P
ans2 = []
while P2 and cnt < 20:
    p = max(1, P2 - 26 * (20 - cnt - 1))
    ans2.append(p)
    P2 -= p
    cnt += 1

ans1 = ''.join([chr(ord('a') + a - 1) for a in ans1])
ans2 = ''.join([chr(ord('a') + a - 1) for a in ans2])

if P1 == 0 and ans1 != S:
    print(ans1)
elif P2 == 0 and ans2 != S:
    print(ans2)
else:
    print('NO')

感想

推定水diffらしい。令和ABCで出たら半分は通しそう。
もっとうまい方法あったら教えてください。