Port 53

明日のための技術メモ

AtCoder ABC170

AtCoder ABC170解いた分だけまとめ。
ABC3完。Bで1ペナ、Cでコーナーケースに気づかず4ペナしてしまった。
コーナーケース気をつけないと行けないなと痛感した。

目次

解説AC

A. Five Variables

f:id:saturn-glave:20200617215114p:plain

問題文

0が出ている要素のindexを拾ってあげる。
ただしn番目なので、indexにプラス1すること。

ACしたコード

# coding:utf-8
x = list(map(int, input().split()))
print(x.index(0) + 1)

B. Crane and Turtle

f:id:saturn-glave:20200617215300p:plain

問題文

鶴亀算。鶴しかいない、亀しかいないパターンもあることを忘れないように。(やらかした)
足の数の合計を使って、鶴の匹数を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

f:id:saturn-glave:20200617215612p:plain

問題文

ちょっとした引っ掛けあり。
リストに範囲の境界である 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

f:id:saturn-glave:20200617220201p:plain

問題文

そろそろ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)