ABC161 復習

atcoder.jp

A問題

変数のスワップができれば解けますね。
こういう時、Pythonは便利ですよね。

x, y, z = map(int, input().split())
x, y = y, x
x, z = z, x

print(str(x) + ' ' + str(y) + ' ' + str(z))

B問題

問題文にあるものをそのまま記載すればいいです。 一つ注意点としては、境界値になる[総得票数 / 4 * m]を計算するときに切り捨て等で答えがおかしくなる場合があることでしょうか。(私はそれで無事1WA・・)

n, m = map(int, input().split())
votes = list(map(int, input().split()))
total_votes = sum(votes)
border = total_votes / (4 * m)

count = 0
for a in votes:
    if a < border:
        continue
    count += 1

if count >= m:
    print('Yes')
else:
    print('No')

C問題

「何度も連続して減算する」を、除算だと気づければ実装はあまり難しくないですね。
と、いいつつも1WAしたんですが・・。 ちなみに、下記が私が提出したコードですが、もっと簡潔にprint(min(n%k,k-n%k))でいけます。

n, k = map(int, input().split())

if n >= k:
    if n % k == 0:
        print(0)
    else:
        ans = min(n % k, abs(n % k - k))
        print(ans)
else:
    ans = min(n, abs(n - k))
    print(ans)

D問題

解法が2つあるそうです。私は再帰関数を作成して、ルンルン数を生成する方法を取りました。(ソースコード
ただし、サンプルで最大入力数があったからよかったものの、そうでなかったら再帰では解けなかったと思います。 (再帰から抜ける条件がわからないので。)

そういうわけなので、もう一つの解法であるキューを使用した場合について、やってみました。

from collections import deque
k = int(input())

#初めに、1~9まではキューに入れておく
q = deque([i for i in range(1, 10)])
ans = 0
while True:
    v = q.popleft()
    ans += 1
    if ans == k:
        print(v)
        break
    
    #末尾の1桁を求める
    last_digit = v % 10
    #求めた末尾の1桁との差が1になる数字を最後の1桁にする
    #つまり、末尾の1桁に対して-1,+0,+1とする計算を行う
    for i in range(-1, 2):
        new_digit = last_digit + i
        #末尾に足すのは0~9だけなので、範囲外のものはキューに入れない
        if new_digit < 0 or new_digit > 9:
            continue
        q.append(v * 10 + new_digit)

書いてみると、実にすっきり書けますね。これを本番中に解けるようになるよう、頑張ります。

今日はここまでにします。