216 C-問題
問題文
空の箱があります。髙橋君は以下の2 種類の魔法を好きな順番で好きな回数使えます。
・魔法 A :箱の中にボールを 1 つ増やす
・魔法 B :箱の中のボールの数を 2 倍にする
合計 120 回以内の魔法で、箱の中のボールの数をちょうど N 個にする方法を 1 つ教えてください。
ポイント
・ゴールから逆算して解いていく
「2倍する ⇔ 2 で割る」「1つ増やす ⇔ 1 をひく」
216C.py
# 入力
N = int(input())
# 答えを格納する
ans = ""
while N: # N がゼロになるまで逆算していく
if N % 2 == 0: # 2で割れるならBを先頭に入れる、割れない場合はAを先頭に入れる
ans = 'B' + ans
N //= 2
else:
ans = 'A' + ans
N -= 1
print(ans)
217 C-問題
ポイント
・index を合わせるためにリストの先頭を [0] で埋める
・リストのindex1から出力するときは、print(*Q[1:]) と記述する
217C.py
# 入力例
3
2 3 1
N = int(input())
# P[0] を埋めるため先頭に [0] をプラス
P = [0] + list(map(int, input().split()))
# P: [0, 2, 3, 1]
# リスト Q を用意
Q = [0] * (N + 1)
for i in range(1 ,N + 1):
Q[P[i]] = i
# Q: [0, 3, 1, 2]
# 先頭は、不要なので インデックス1から出力する
print(*Q[1:])
答え
3 1 2