[PYTHON] AtCoder Beginner Contest 181 Teilnahmebericht

AtCoder Beginner Contest 181 Teilnahmebericht

ABC181A - Heavy Rotation

Brechen Sie in 1 Minute durch. Schreiben Sie einfach.

N = int(input())

if N % 2 == 0:
    print('White')
else:
    print('Black')

ABC181B - Trapezoid Sum

Es brach in 4 Minuten durch. Es dauerte lange, bis die Formel geändert wurde, um die Summe von A nach A-1 von der Summe bis B zu subtrahieren, da die Formel zur Berechnung der Summe von A nach B nicht herauskam.

N = int(input())

result = 0
for _ in range(N):
    A, B = map(int, input().split())
    result += B * (B + 1) // 2
    result -= (A - 1) * A // 2
print(result)

Als ich mich beruhigte, kam die Zeremonie richtig heraus (lacht).

N = int(input())

result = 0
for _ in range(N):
    A, B = map(int, input().split())
    result += (A + B) * (B - A + 1) // 2
print(result)

ABC181C - Collinearity

Brechen Sie in 19 Minuten durch. Beginnen Sie mit Google die Formel der geraden Linie, die durch die beiden Punkte verläuft. N ≤ 10 2 </ sup> Also ist * O * (* N * 3 </ sup>) OK Es dauerte eine Weile, bis ich es bemerkte. Im Eingabe- / Ausgabebeispiel kam die Division von 0 heraus und ich erinnerte mich an die gerade Linie x = a (lacht). Obwohl die Formel etwas falsch war, hatte ich das Glück, im Eingabe- / Ausgabebeispiel aufgegriffen zu werden. Kann repariert werden, AC.

N = int(input())
xy = [tuple(map(int, input().split())) for _ in range(N)]

for i in range(N - 1):
    xi, yi = xy[i]
    for j in range(i + 1, N):
        xj, yj = xy[j]
        for k in range(j + 1, N):
            x, y = xy[k]
            if xj == xi:
                if x == xi:
                    print('Yes')
                    exit()
            elif yj == yi:
                if y == yi:
                    print('Yes')
                    exit()
            elif abs(y - (yj - yi) / (xj - xi) * (x - xi) - yi) < 0.000001:
                print('Yes')
                exit()
print('No')

Nachtrag: Wenn Sie beide Seiten mit dem Divisionsterm multiplizieren, können Sie mit einer ganzen Zahl genau rechnen, und es gab keine Division von 0 ...

N = int(input())
xy = [tuple(map(int, input().split())) for _ in range(N)]

for i in range(2, N):
    xi, yi = xy[i]
    for j in range(1, i):
        xj, yj = xy[j]
        for k in range(j):
            x, y = xy[k]
            if (y - yi) * (xj - xi) == (yj - yi) * (x - xi):
                print('Yes')
                exit()
print('No')

ABC181D - Takahashi Unevolved

Brechen Sie in 13,5 Minuten durch. Wenn Sie feststellen, dass Ziffern über 1000 automatisch ein Vielfaches von 8 sind, endet das Problem sofort. Ich konnte also mit dem folgenden Code eine AC-Verbindung herstellen, aber es scheint einen Fehler zu geben. 3 Ziffern Zu dem oben genannten Zeitpunkt habe ich '008' oder '016' nicht als Baum verwendet, und ich dachte, dass dies eine Überprüfung für ein Muster sein könnte, bei dem die verbleibenden Zeichen in 4 Ziffern 0 sind. Gab es jedoch aufgrund der Einschränkung des Problems überhaupt 0? ,sicher.

from collections import Counter

S = input()

if len(S) == 1:
    if S == '8':
        print('Yes')
    else:
        print('No')
elif len(S) == 2:
    if ''.join(sorted(S)) in ['16', '24', '23', '04', '48', '56', '46', '27', '08', '88', '69']:
        print('Yes')
    else:
        print('No')
else:
    c = Counter(S)
    for x in range(104, 1000, 8):
        d = Counter(str(x))
        for k in d:
            if k not in c:
                break
            if d[k] > c[k]:
                break
        else:
            print('Yes')
            exit()
    print('No')

ABC181E - Traveling Salesman among Aerial Cities

Es bricht in 36,5 Minuten durch. WA2. Es bleibt nichts anderes übrig, als jedes Paar einzeln mit dem Lehrer zu versuchen. Wenn Sie also die kumulative Summe von vorne und hinten nehmen, können Sie sie zu * O * (* N *) machen. Also habe ich mit * O * (log N </ i>) übersprungen und insgesamt * O * ( N </ i> log N </ i>) erhalten. Kalorien implementiert War teuer aber nicht schwer.

from itertools import accumulate
from bisect import bisect_left
from collections import Counter

INF = float('inf')

N, M = map(int, input().split())
H = list(map(int, input().split()))
W = list(map(int, input().split()))

W.sort()

c = Counter(H)
h = sorted(k for k in c if c[k] % 2 == 1)
n = len(h)

l = list(accumulate(h[i + 1] - h[i] for i in range(0, n - 1, 2)))
r = list(accumulate(h[i] - h[i - 1] for i in range(n - 1, 0, -2)))

result = INF
for i in range(n):
    t = 0
    a = i // 2 - 1
    if a != -1:
        t += l[a]
    a = (n - 1 - i) // 2 - 1
    if a != -1:
        t += r[a]
    j = bisect_left(W, h[i])
    u = INF
    if j != M:
        u = min(u, W[j] - h[i])
    if j != 0:
        u = min(u, h[i] - W[j - 1])
    t += u
    if i % 2 == 1:
        t += h[i + 1] - h[i - 1]
    result = min(result, t)
print(result)

Recommended Posts