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も変わらないので、誤差に気づくべきであった。
反省。
周りが勉強して成長していくため、相対的な実力が落ちていく。
緑の維持は大変そう。
コメント