ABC166 復習

D問題の壁高すぎますねぇ・・。 (今回のも数学ゲーか?)
C問題までは20分ほどで解けたのでよかったのですが。

atcoder.jp

A - A?C

if-elseが書ければなんとかなります。
与えられた文字列SがABCか、ARCかで出力する文字列を変化させればよいだけです。

if input() == 'ABC':
    print('ARC')
else:
    print('ABC')

B - Trick or Treat

少し迷いました。問題の意味がよくわからず・・。
とはいえ、わかってしまえばなんてことはないです。

N, K = map(int, input().split())

ans = [0] * (N)
for i in range(K):
    #d人がお菓子を持っている
    d = int(input())
    #持っている人たち
    l = list(map(int, input().split()))
    for j in l:
        ans[j-1] += 1

a = 0
for i in ans:
    if i == 0:
        a += 1

print(a)

C - Peaks

個人的には、これまで解いてきたC問題の中でもかなりすんなり解けた問題でした。
問題文の通りに愚直に書ければよいだけなので、工夫とかもいらないのですが。
肝になるのは、展望台iから展望台jを結んでいることをどのようにデータで表現するかかと思います。
私は配列で実現しました。(以下、コード参照)

N, M = map(int, input().split())
heights = list(map(int, input().split()))

roots = [[] for i in range(N)]

#展望台aと展望台bを結ぶ道を表す
#roots[0] = [1,2]なら、展望台0からは展望台1,2がつながっている
for i in range(M):
    a, b = map(int, input().split())
    #0-indexにするため、-1する
    roots[a-1].append(b-1)
    roots[b-1].append(a-1)

ans = 0
for i in range(len(roots)):
    root = roots[i]
    #展望台から道が伸びていなければよい展望台
    if not root:
        ans += 1
        continue
    good = True
    #道があるなら、自分と、自分とつながっている展望台の高さを比較する
    for j in root:
        if heights[i] <= heights[j]:
            good = False
            break
    if good:
        ans += 1

print(ans)

D - I hate Factorization

わかりませんでした。
C問題までが20分ほどで終わってしまったので、40分ほどは考えていたと思いますが、さっぱりでした。
他の方の提出を見ると、探索でいけるようです。

X = int(input())


for a in range(-500, 500):
    for b in range(-500, 500):
        if a ** 5 - b ** 5 == X:
            print(a, b)
            exit()

コンテスト中は、「D問題で探索は出ないやろ」と思っていたし、そもそもなぜ-500~500の範囲で解が求まるのかもわかっていません。(5005が1013以上あるからとかそういうことなんだろうか)
教訓としては、とりあえず探索してみるってことなのかな・・。

今回はここまでにします。それでは。