🌟

AtCoder ABC207 個人的メモ

2021/06/28に公開

所感

abc3完
abc207score

A - Repression

A,B,Cの内の一番小さい数字以外を足せばおk

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

print(sum(sorted(A)[1:]))

B - Hydrate

問題文を全然理解できなかったので、テキトーにシミュレーションしたら通っちゃった。

必要な操作回数をxとすると、問題文の条件はA+Bx\leq CxDで言い換えられる。
これを変形すると\frac{A}{CD-B}\leq xとなる。
xは正の整数だからCD-B\leq 0の場合は-1を出力して、そうでない場合は切り上げの割り算となる\lceil \frac{A}{CD-B}\rceilを出力すればおk。

\frac{A}{CD-B}\leq xの式からxがA以下になることが分かるので、愚直にシミュレーションしても良い。
https://atcoder.jp/contests/abc207/editorial/2143

A, B, C, D = map(int, input().split())

cal = C * D - B
if cal <= 0:
    print(-1)
else:
    print(-(- A // cal))

コンテスト中に出したコード
blue = A
red = 0
for i in range(10 ** 6):
    blue += B
    red += C
    if blue <= red * D:
        break
else:
    print(-1)
    exit()

print(i + 1)

C - Many Segments

与えられる区間は整数で表されているが、表現しているのは実数からなる区間。
なので、(2,5)[3,4]ではなく[2.1,4.9]とすればおk。

from itertools import combinations

N = int(input())
lst = []
for _ in range(N):
    t, l, r = map(int, input().split())
    if t == 1:
        lst.append((l, r))
    if t == 2:
        lst.append((l, r - 0.1))
    if t == 3:
        lst.append((l + 0.1, r))
    if t == 4:
        lst.append((l + 0.1, r - 0.1))

ans = 0
for left, right in combinations(lst, 2):
    a, b, c, d = left + right
    if max(a, c) <= min(b, d):
        ans += 1

print(ans)

D - Congruence Points

https://kanpurin.hatenablog.com/entry/2021/06/26/224005

from itertools import permutations


def cal_dist(a: list, b: list):
    """2点a,b間の距離を計算"""
    return (a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2


def cal_2d_vec_prod(a: list, b: list, c: list):
    """点aから点bへのベクトルと点aから点cへのベクトルの外積"""
    return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0])


def cal_3pnts(a: int, b: int, S_or_C: set):
    """
    事前に選んだ点a、点bとそれ以外の点それぞれに対して選んだ2点それぞれからの距離と外積を計算
    """
    # S0=Ta,S1=Tb,Sa=Tcとする
    return {(cal_dist(S_or_C[a], S_or_C[c]),
             cal_dist(S_or_C[b], S_or_C[c]),
             cal_2d_vec_prod(S_or_C[a], S_or_C[b], S_or_C[c])
             ) for c in range(N)}


N = int(input())
S = [list(map(int, input().split())) for _ in range(N)]
T = [list(map(int, input().split())) for _ in range(N)]

ans = False
if N == 1:
    ans = True

elif N == 2:
    ans = cal_dist(S[0], S[1]) == cal_dist(T[0], T[1])

else:
    # Sから適当な2点を選び、それ以外の点それぞれに対して選んだ2点それぞれからの距離と外積を計算
    lut_S = cal_3pnts(0, 1, S)
    # Tから2点を選んだ時、その2点とそれら以外の点との距離と外積が事前計算と一致するか?
    ans = any(lut_S == cal_3pnts(a, b, T)
              for a, b in permutations(range(N), 2))

if ans:
    print("Yes")
else:
    print("No")

Discussion