AtCoder Beginner Contest 207の感想

ABC207に参加した。

AtCoder Beginner Contest 207 - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

A – Repression

総和から最小値を引く。

abc = list(map(int, input().split()))

ans = sum(abc) - min(abc)
print(ans)

B – Hydrate

数学的に式変形をすればO(1)で解ける.

a, b, c, d = map(int, input().split())

if c * d - b <= 0:
    print(-1)
else:
    import math

    ans = math.ceil(a / (c * d - b))
    print(ans)

C – Many Segments

区間の端は整数なので、少数を足すことで開区間を閉区間に変換することで条件判定をやりやすくする。

左端が小さい順にソートし、一方の区間の最大値が、もう一方の区間に含まれていればOK。

n = int(input())
tlr = [list(map(int, input().split())) for _ in range(n)]
tlr = sorted(tlr, key=lambda x: x[1])


def preprocess(x):
    t, l, r = x

    delta = 0.1
    if t == 1:
        pass
    elif t == 2:
        r -= delta
    elif t == 3:
        l += delta
    elif t == 4:
        l += delta
        r -= delta

    return l, r


ans = 0
for i in range(n):
    for j in range(i + 1, n):
        l1, r1 = preprocess(tlr[i])
        l2, r2 = preprocess(tlr[j])

        # if max(l1, l2) <= min(r1, r2):
        if not r1 < l2:
            ans += 1

print(ans)

C問題は区間に少数を足すところまではすぐに思いついたが、小さすぎる値を採用していたため誤差の問題でACできずドツボにハマっていた。

この問題の本質的には+0.1も+1e-10も変わらないので、誤差に気づくべきであった。

反省。

周りが勉強して成長していくため、相対的な実力が落ちていく。

緑の維持は大変そう。

コメント

タイトルとURLをコピーしました