[PYTHON] AtCoder Anfängerwettbewerb Past Question Challenge 9

AtCoder Anfängerwettbewerb Past Question Challenge 9

ABC071D - Coloring Dominoes

Erstens, wenn der linke Rand vertikal ist, gibt es 3 Möglichkeiten zum Malen. Wenn er horizontal ist, gibt es 6 Möglichkeiten mit 3 * 2. Wenn die Vertikale neben der Vertikalen liegt, sollte sie sich von der vorherigen vertikalen Farbe unterscheiden, also 2 Wenn die Horizontale neben die Vertikale kommt und Sie sich für die Oberseite entscheiden, gibt es zwei Möglichkeiten, da sie sich von der Vertikalen unterscheiden sollte. Auf der Unterseite gibt es nur eine andere Möglichkeit, also gibt es zwei Möglichkeiten. Horizontal Wenn die Vertikale neben die Horizontale kommt, gibt es nur einen Weg, da bereits zwei Farben festgelegt wurden. Wenn die Horizontale neben die Horizontale kommt, gibt es drei Möglichkeiten:

0022  0011  0011
1100  1100  1122

Alles was Sie tun müssen, ist es zu addieren.

N = int(input())
S1 = input()
S2 = input()

if S1[0] == S2[0]:
    result = 3
else:
    result = 6
x = 0
W = len(S1)
while x < W:
    if S1[x] == S2[x]:
        if x + 1 == W:
            break
        result *= 2
        result %= 1000000007
        x += 1
    else:
        if x + 2 == W:
            break
        if S1[x + 2] != S2[x + 2]:
            result *= 3
            result %= 1000000007
        x += 2
print(result)

ABC109D - Make Them Even

Es gibt keine Begrenzung für die minimale Bewegung. Gehen Sie also von links oben nach rechts, wenn Sie das Ende erreichen, gehen Sie nach links, wenn Sie das Ende erreichen, nach rechts und so weiter. Wenn es sich dann um eine ungerade Zahl handelt und Sie das Senden an das nächste Quadrat wiederholen, handelt es sich entweder um eine gerade Zahl oder nur um das letzte Quadrat um eine ungerade Zahl.

H, W = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(H)]

result = []
y = 0
while y < H:
    x = 0
    while x < W:
        if a[y][x] % 2 == 1:
            if x == W - 1:
                if y == H - 1:
                    break
                else:
                    result.append('%d %d %d %d' % (y + 1, x + 1, y + 2, x + 1))
                    a[y + 1][x] += 1
            else:
                result.append('%d %d %d %d' % (y + 1, x + 1, y + 1, x + 2))
                a[y][x + 1] += 1
        x += 1
    if y == H - 1:
        break
    y += 1
    x = W - 1
    while x >= 0:
        if a[y][x] % 2 == 1:
            if x == 0:
                if y == H - 1:
                    break
                else:
                    result.append('%d %d %d %d' % (y + 1, x + 1, y + 2, x + 1))
                    a[y + 1][x] += 1
            else:
                result.append('%d %d %d %d' % (y + 1, x + 1, y + 1, x))
                a[y][x - 1] += 1
        x -= 1
    y += 1

print(len(result))
print('\n'.join(result))

ABC096D - Five, Five Everywhere

Wenn Sie durch 5 teilen, können Sie die verbleibenden Primzahlen nach Bedarf in aufsteigender Reihenfolge anordnen. Jede Kombination ist ein Vielfaches von 5.

N = int(input())

result = []
sieve = [0] * (55555  + 1)
sieve[0] = -1
sieve[1] = -1
for i in range(2, 55555 + 1):
    if sieve[i] != 0:
        continue
    if i % 5 == 1:
        result.append(i)
        if len(result) == N:
            break
    sieve[i] = i
    for j in range(i * i, 55555 + 1, i):
        if sieve[j] == 0:
            sieve[j] = i
print(*result)

ABC099D - Good Grid

Die Farbkombination ist 30 </ sub> C 3 </ sub> = 4060, sodass Sie eine vollständige Suche durchführen können. Da jedoch N ≤ 500 ist, * O * (4060 × 500), wenn Sie dies ohne nachzudenken tun. 2 </ sup> ≒ 10 10 </ sup>) und TLE sind unvermeidlich. (I + j) Wenn Sie nach dem Rest von% 3 gruppieren und die Originalfarben zählen, * O * (4060) × 30 × 3 × 3,7 × 10 5), so ist es gelöst.

from itertools import permutations

N, C = map(int, input().split())
D = [list(map(int, input().split())) for _ in range(C)]
c = [list(map(int, input().split())) for _ in range(N)]

a = [[0] * C for _ in range(3)]
for y in range(N):
    for x in range(N):
        t = ((x + 1) + (y + 1)) % 3
        a[t][c[y][x] - 1] += 1

result = float('inf')
for b in permutations(range(C), 3):
    t = 0
    for i in range(3):
        for j in range(C):
            t += a[i][j] * D[j][b[i]]
    result = min(result, t)
print(result)

ABC103D - Islands War

Ich hatte die Intuition, dass das Sortieren nach b während des Keyence Programming Contest 2020 B - Roboterarme schmerzhaft war. Es ist ein Planungsproblem. Danach sollte ich so viele Brücken wie nötig entfernen, aber zuerst habe ich die von Segment Tree entfernten Brücken aufgezeichnet und gelöst. Nun, * O * () Ich kann es mit N </ i> log N </ i> lösen.

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

ab.sort(key=lambda x: x[1])

result = 0
t = -1
for a, b in ab:
    a, b = a - 1, b - 1
    if a <= t < b:
        continue
    result += 1
    t = b - 1
print(result)

ABC055D - Menagerie

Wenn Sie sich für das 1. und 2. Tier entscheiden, haben Sie danach 1 Wahl, und wenn Sie einen Fehler machen, wissen Sie, dass es am Ende einen Widerspruch gibt. Wenn Sie also das 1. und 2. Tier mit 4 Mustern der Runde S, W machen Gut. * O * (4 × 10 5 </ sup>), daher gibt es kein Problem hinsichtlich des Berechnungsbetrags.

from itertools import product

N = int(input())
s = input()

swap = {'S': 'W', 'W': 'S'}
for a, b in product('SW', repeat=2):
    t = [None] * N
    t[0] = a
    t[1] = b
    for i in range(1, N - 1):
        if t[i] == 'S':
            if s[i] == 'o':
                t[i + 1] = t[i - 1]
            elif s[i] == 'x':
                t[i + 1] = swap[t[i - 1]]
        elif t[i] == 'W':
            if s[i] == 'o':
                t[i + 1] = swap[t[i - 1]]
            elif s[i] == 'x':
                t[i + 1] = t[i - 1]
    if t[N - 1] == 'S':
        if s[N - 1] == 'o' and t[N - 2] != t[0]:
            continue
        elif s[N - 1] == 'x' and t[N - 2] == t[0]:
            continue
    elif t[N - 1] == 'W':
        if s[N - 1] == 'o' and t[N - 2] == t[0]:
            continue
        elif s[N - 1] == 'x' and t[N - 2] != t[0]:
            continue
    if t[0] == 'S':
        if s[0] == 'o' and t[N - 1] != t[1]:
            continue
        elif s[0] == 'x' and t[N - 1] == t[1]:
            continue
    elif t[0] == 'W':
        if s[0] == 'o' and t[N - 1] == t[1]:
            continue
        elif s[0] == 'x' and t[N - 1] != t[1]:
            continue
    print(''.join(t))
    exit()
print(-1)

Recommended Posts