AtCoder ABC170
AtCoder ABC170解いた分だけまとめ。
ABC3完。Bで1ペナ、Cでコーナーケースに気づかず4ペナしてしまった。
コーナーケース気をつけないと行けないなと痛感した。
目次
解説AC
A. Five Variables
0が出ている要素のindexを拾ってあげる。
ただしn番目なので、indexにプラス1すること。
ACしたコード
# coding:utf-8 x = list(map(int, input().split())) print(x.index(0) + 1)
B. Crane and Turtle
鶴亀算。鶴しかいない、亀しかいないパターンもあることを忘れないように。(やらかした)
足の数の合計を使って、鶴の匹数をiとして全探索しておしまい。
ACしたコード
# coding:utf-8 x, y = map(int, input().split()) for i in range(0, x + 1): leg = i * 2 + (x - i) * 4 if leg == y: print('Yes') exit() print('No')
C. Forbidden List
ちょっとした引っ掛けあり。
リストに範囲の境界である 1 や 100 がいる時、答えが 0, 101があり得ることに注意。
その範囲に気をつけて、リストと数直線で集合を取りながら候補を絞って全探索する。
ポイント
- 入力値の範囲に気をつけること!コーナーケースのヒント!
ACしたコード
# coding:utf-8 x, n = map(int, input().split()) p = list(map(int, input().split())) if n == 0: print(x) else: ps = sorted(p) tmp = list(range(-201, 200)) ans_list = list(set(tmp) ^ set(ps)) ans_list = sorted(ans_list) # print(tmp, ans_list) diff = [] for i in ans_list: diff.append(abs(i - x)) print(ans_list[diff.index(min(diff))])
D. Not Divisible
そろそろD問題にも手を出してみたいと思うそんな感じ。
ここから解説AC。なんとなく素数上げとくか、で本番終わってしまったので、
解説放送を聞いてその考え方で実装してみた。
0から数列Aの最大値までをインデックスにとるリストを別で用意しておき、(countとする)
Aの要素について、countのインデックスで割り切れるかを調べて、
countにAの各要素で割り切れた回数を書く。
countの要素について、1回だったものだけが答えとなる。
解説ACしたコード
# coding:utf-8 n = int(input()) a = list(map(int, input().split())) m = max(a) count = [0 for _ in range(m + 1)] ans = 0 for i in a: if count[i] != 0: count[i] = 2 continue for j in range(i, m + 1, i): count[j] += 1 for i in a: if count[i] == 1: # print(i) ans += 1 print(ans)