** AtCoder Beginner Contest 184 ** ** A, B, C Probleme ** werden mit ** Python 3 ** so sorgfältig wie möglich erklärt.
Ich möchte eine Lösung erklären, die die folgenden drei Punkte erfüllt, nicht nur eine Methode, die gelöst werden kann.
Wenn Sie Fragen oder Anregungen haben, hinterlassen Sie bitte einen Kommentar oder Twitter. Twitter: u2dayo
[ABC184 Zusammenfassung](# abc184-Zusammenfassung) [Ein Problem "Determinante"](# eine Problemdeterminante) [B Problem "Quiz"](# B Problem Quiz) [C Problem "Super Ryuma"](#c Problem Super-Ryuma)
Gesamtzahl der Einreichungen: 7822
Performance | AC | Ergebnis | Zeit | Rangfolge(Innerhalb bewertet) |
---|---|---|---|---|
200 | AB---- | 300 | 12 Minuten | 5984(5769)Rang |
400 | AB---- | 300 | 6 Minuten | 4983(4768)Rang |
600 | AB---- | 300 | 4 Minuten | 4132(3917)Rang |
800 | ABC--- | 600 | 88 Minuten | 3271(3056)Rang |
1000 | ABC--- | 600 | 37 Minuten | 2454(2240)Rang |
1200 | ABCD-- | 1000 | 105 Minuten | 1767(1556)Rang |
1400 | ABC--F | 1200 | 97 Minuten | 1229(1026)Rang |
1600 | ABCD-F | 1600 | 66 Minuten | 832(636)Rang |
1800 | ABCDEF | 2100 | 97 Minuten | 551(367)Rang |
2000 | ABCDEF | 2100 | 73 Minuten | 352(195)Rang |
2200 | ABCDEF | 2100 | 57 Minuten | 228(96)Rang |
2400 | ABCDEF | 2100 | 45 Minuten | 130(44)Rang |
Farbe | Anzahl der Personen | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|
Asche | 3253 | 98.7 % | 92.0 % | 15.3 % | 2.3 % | 1.0 % | 0.7 % |
Tee | 1499 | 99.3 % | 99.1 % | 45.8 % | 9.5 % | 4.9 % | 4.5 % |
Grün | 1184 | 99.5 % | 99.5 % | 63.4 % | 29.6 % | 18.4 % | 14.1 % |
Wasser | 729 | 99.9 % | 99.9 % | 78.5 % | 58.7 % | 49.1 % | 54.6 % |
Blau | 360 | 99.7 % | 99.7 % | 94.4 % | 88.6 % | 86.1 % | 88.1 % |
Gelb | 175 | 96.0 % | 96.0 % | 93.1 % | 94.3 % | 91.4 % | 96.6 % |
Orange | 31 | 96.8 % | 96.8 % | 96.8 % | 96.8 % | 96.8 % | 96.8 % |
rot | 11 | 90.9 % | 90.9 % | 90.9 % | 90.9 % | 100.0 % | 100.0 % |
** Problemseite **: A --Determinant ** <font color = # 808080> Grau </ font> Richtige Antwortrate des Codierers **: 98,7% ** <font color = # 804000> Brown </ font> Richtige Antwortrate des Codierers **: 99,3% ** <font color = # 008000> Grün </ font> Richtige Antwortrate des Codierers **: 99,5%
Auch wenn Sie die Matrixformel nicht kennen, können Sie sie genau so ausführen, wie sie geschrieben steht.
A, B = map(int, input().split())
C, D = map(int, input().split())
print(A * D - B * C)
** Problemseite **: B - Fragen ** <font color = # 808080> Grau </ font> Richtige Antwortrate des Codierers **: 92,0% ** <font color = # 804000> Brown </ font> Richtige Antwortrate des Codierers **: 99,1% ** <font color = # 008000> Grün </ font> Richtige Antwortrate des Codierers **: 99,5%
Es ist in Ordnung, wenn Sie die for-Schleife gehorsam verwenden und sie gemäß der Problemstellung implementieren. Wenn Sie Klarheit priorisieren, ohne zu versuchen, sie auf coole Weise zu schreiben, können Sie Fehler reduzieren.
N, X = map(int, input().split())
S = input()
score = X
for char in S:
if char == "o":
score += 1
else:
if score > 0:
score -= 1
print(score)
** Problemseite **: C - Super Ryuma ** <font color = # 808080> Grau </ font> Richtige Antwortrate des Codierers **: 15,3% ** <font color = # 804000> Brown </ font> Richtige Antwortrate des Codierers **: 45,8% ** <font color = # 008000> Grün </ font> Richtige Antwortrate des Codierers **: 63,4%
$ 1 $ Es gibt ein Stück "Super Ryoma", mit dem Sie eine der folgenden Bewegungen mit Ihren Händen ausführen können.
** - Bewege deine Lieblingsmasse diagonal (genau wie die Ecke eines Shogi. Wir nennen es ** diagonale Bewegung **) ** ** - Dreimal nach oben, unten, links und rechts drehen ("Manhattan-Entfernung" kann sich innerhalb von $ 3 $ zu einem Quadrat bewegen. Wir nennen es ** Super Ryoma-Bewegung **) **
Da die Start- und Zielkoordinaten angegeben sind, geben Sie bitte aus, wie viele Züge Sie in "Super Ryoma" ausführen können.
Es scheint, dass es nicht viel Sinn macht. ** Ich bin mir nicht sicher, daher möchte ich vorerst ein Programm schreiben, das die Anzahl der Bewegungen, um die Regel zu finden, ehrlich berechnet und ausgibt. Sie können es auf Papier schreiben, aber es ist einfacher und weniger fehleranfällig, es zu programmieren. ** (Als Referenz habe ich 5 $ ausgegeben, um diesen Code zu schreiben, und ich hatte große Probleme, ihn während des Wettbewerbs auf Papier zu schreiben.)
def change(a, b, p):
for c in range(K):
for d in range(K):
if (a + b) == (c + d) or (a - b) == (c - d) or (abs(a - c) + abs(b - d)) <= 3:
if grid[c][d] == -1:
grid[c][d] = p + 1
K = 41
grid = [[-1] * K for _ in range(K)]
grid[K // 2][K // 2] = 0
for i in range(10):
for a in range(K):
for b in range(K):
if grid[a][b] == i:
change(a, b, i)
for row in grid:
print(*row)
Dann sieht die Ausgabe so aus.
1 2 2 2 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 2 2 2 1
2 1 2 2 2 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 2 2 2 1 2
2 2 1 2 2 2 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 2 2 2 1 2 2
2 2 2 1 2 2 2 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 2 2 2 1 2 2 2
2 2 2 2 1 2 2 2 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 2 2 2 1 2 2 2 2
3 2 2 2 2 1 2 2 2 2 3 2 3 2 3 2 3 2 3 2 3 2 2 2 2 1 2 2 2 2 3
2 3 2 2 2 2 1 2 2 2 2 3 2 3 2 3 2 3 2 3 2 2 2 2 1 2 2 2 2 3 2
3 2 3 2 2 2 2 1 2 2 2 2 3 2 3 2 3 2 3 2 2 2 2 1 2 2 2 2 3 2 3
2 3 2 3 2 2 2 2 1 2 2 2 2 3 2 3 2 3 2 2 2 2 1 2 2 2 2 3 2 3 2
3 2 3 2 3 2 2 2 2 1 2 2 2 2 3 2 3 2 2 2 2 1 2 2 2 2 3 2 3 2 3
2 3 2 3 2 3 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 3 2 3 2 3 2
3 2 3 2 3 2 3 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 3 2 3 2 3 2 3
2 3 2 3 2 3 2 3 2 2 2 2 1 2 2 1 2 2 1 2 2 2 2 3 2 3 2 3 2 3 2
3 2 3 2 3 2 3 2 3 2 2 2 2 1 1 1 1 1 2 2 2 2 3 2 3 2 3 2 3 2 3
2 3 2 3 2 3 2 3 2 3 2 2 2 1 1 1 1 1 2 2 2 3 2 3 2 3 2 3 2 3 2
3 2 3 2 3 2 3 2 3 2 2 2 1 1 1 0 1 1 1 2 2 2 3 2 3 2 3 2 3 2 3
2 3 2 3 2 3 2 3 2 3 2 2 2 1 1 1 1 1 2 2 2 3 2 3 2 3 2 3 2 3 2
3 2 3 2 3 2 3 2 3 2 2 2 2 1 1 1 1 1 2 2 2 2 3 2 3 2 3 2 3 2 3
2 3 2 3 2 3 2 3 2 2 2 2 1 2 2 1 2 2 1 2 2 2 2 3 2 3 2 3 2 3 2
3 2 3 2 3 2 3 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 3 2 3 2 3 2 3
2 3 2 3 2 3 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 3 2 3 2 3 2
3 2 3 2 3 2 2 2 2 1 2 2 2 2 3 2 3 2 2 2 2 1 2 2 2 2 3 2 3 2 3
2 3 2 3 2 2 2 2 1 2 2 2 2 3 2 3 2 3 2 2 2 2 1 2 2 2 2 3 2 3 2
3 2 3 2 2 2 2 1 2 2 2 2 3 2 3 2 3 2 3 2 2 2 2 1 2 2 2 2 3 2 3
2 3 2 2 2 2 1 2 2 2 2 3 2 3 2 3 2 3 2 3 2 2 2 2 1 2 2 2 2 3 2
3 2 2 2 2 1 2 2 2 2 3 2 3 2 3 2 3 2 3 2 3 2 2 2 2 1 2 2 2 2 3
2 2 2 2 1 2 2 2 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 2 2 2 1 2 2 2 2
2 2 2 1 2 2 2 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 2 2 2 1 2 2 2
2 2 1 2 2 2 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 2 2 2 1 2 2
2 1 2 2 2 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 2 2 2 1 2
1 2 2 2 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 2 2 2 1
** Anscheinend habe ich das Gefühl, dass ich es mit maximal $ 3 $ verschieben kann. Überlegen wir uns also, warum dies passiert. ** ** **
Angenommen, Sie haben ein schwarz-weißes Schachbrett und beginnen mit einem schwarzen Quadrat. ** Diagonal bewegen $ 2 $ Sie können von Hand zu jedem schwarzen Quadrat auf dem Schachbrett gehen. Es ist jedoch nicht möglich, sich nur diagonal zu einem weißen Quadrat zu bewegen. Wenn das Ziel ein weißes Quadrat ist, können Sie es um $ 2 $ auf das schwarze Quadrat direkt neben dem Ziel verschieben und dann um $ 1 $ verschieben. Auf diese Weise können Sie für weniger als $ 3 $ zu einem beliebigen Feld auf dem Schachbrett wechseln. ** Aus diesem Grund sind $ 2 $ und $ 3 $ wie ein Schachbrett angeordnet. (Offizieller Kommentar hat ebenfalls eine Zahl)
Nachdem wir nun wissen, dass wir nur an $ 3 $ denken müssen, betrachten wir die bedingten Ausdrücke, die bestimmen, wie viele Hände wir haben werden.
Sie müssen sich nicht nur bewegen, wenn sich Start und Ziel am selben Ort befinden. Bitte legt er einen $ 0 $ Handkoffer in die Probe.
Sie können $ 1 $ natürlich von Hand bewegen, wenn Sie sich um $ 1 $ bewegen können. (?) $ 1 $ Die Bedingungen für einen Ort, an dem Sie sich von Hand bewegen können, sind in der Problembeschreibung angegeben. Wenn Sie also einen der $ 3 $ erfüllen, können Sie sich um $ 1 $ bewegen.
Ist schwierig. Zunächst erinnere ich mich, dass "Super Ryoma" $ 2 $ bewegen kann.
** - Diagonale Bewegung ** ** - Super Ryoma Move **
Die $ 2 $ Handbewegung ist eine Kombination der $ 2 $ Bewegungsarten. Es gibt die folgenden $ 3 $ Muster zum Kombinieren.
** - Super Ryoma bewegen sich $ 2 $ mal ** ** - Diagonale Bewegung $ 2 $ mal ** ** - Diagonale Bewegung $ 1 $ mal und Super Ryoma Bewegung $ 1 $ mal **
Super Ryoma Move $ 1 $ Sie können $ 1 $ Quadrate 3 $ Mal pro Hand nach oben, unten, links und rechts $ bewegen. Mit anderen Worten, Sie können den Super Ryoma $ 2 $ 6-mal von Hand nach oben, unten, links und rechts bewegen.
** Einfach ausgedrückt, wenn die "Manhattan-Entfernung" weniger als 6 $ beträgt, können Sie sie um 2 $ verschieben. Daher ist die Bedingung wie folgt. ** ** **
Sie können sich im Beispiel des Schachbretts überall in der "Masse der gleichen Farbe wie der Startpunkt" bewegen. Lassen Sie uns etwas genauer darüber nachdenken, um es in die Formel aufzunehmen.
Diagonale Bewegung $ 1 $ Von Hand ändern sich die Koordinaten wie folgt:
Daher beträgt die Summe der Änderungen der $ x $ - und $ y $ -Koordinaten entweder $ + 2k $, $ 0 $ oder $ -2k $. ** Beachten Sie, dass die Summe der Änderungen immer gerade ist. Dies bedeutet, dass unabhängig davon, wie oft Sie sich diagonal bewegen, die Summe der Änderungen niemals in einem ungeraden Quadrat endet. (Dieses Konzept heißt Parität / gerade / ungerade) **
Wenn andererseits die Summe der Änderungen gerade ist, können Sie sie von Hand erreichen, egal wie weit sie entfernt ist.
Diagonale Bewegung $ 1 $ Die Zellen, die von Hand bewegt werden können, sind solche mit $ a + b = c + d $ oder $ a-b = c-d $. Bei der Transponierung ist $ (a + b) - (c + d) = 0 $ und $ (a-b) - (c-d) = 0 $.
Von einem Quadrat, das diese Bedingung erfüllt, können Sie Super Ryoma von Hand auf ein Quadrat mit einem Manhattan-Abstand von 3 USD oder weniger verschieben.
$ 0 $ ~ $ 2 $ Wenn Sie es nicht von Hand bewegen können, sind es $ 3 $. Es besteht keine Notwendigkeit zu urteilen.
Schreiben Sie alle bedingten Ausdrücke. Es ist einfacher, den Beurteilungsteil in Funktionen zu unterteilen und den Moment zurückzugeben, in dem die Bedingungen erfüllt sind.
Bitte beachten Sie, dass die richtige Antwort nur erhalten wird, wenn Sie in der Reihenfolge $ 0 $ Hand, $ 1 $ Hand, $ 2 $ Hand, $ 3 $ Hand von der mit der geringsten Anzahl von Schritten urteilen.
def solve():
#0 Hände. Wenn Sie das Beispiel nicht richtig betrachten, werden Sie dieses Muster vergessen.
if a == c and b == d:
return 0
#Es ist ein Zug. Schreiben Sie gemäß der Problemstellung.
if a + b == c + d:
return 1
if a - b == c - d:
return 1
if abs(a - c) + abs(b - d) <= 3:
return 1
#Zwei Züge. Schreiben Sie wie betrachtet.
if abs(a - c) + abs(b - d) <= 6:
return 2
if (abs(a - c) + abs(b - d)) % 2 == 0:
# %Da die Priorität von hoch ist, fügen Sie die linke Seite hinzu()Wenn Sie es nicht beilegen, ist es WA (1 Verlust)
return 2
if abs((a + b) - (c + d)) <= 3:
return 2
if abs((a - b) - (c - d)) <= 3:
return 2
#Wenn Sie es nicht mit 2 Zügen machen können, müssen Sie 3 Züge haben.
return 3
a, b = map(int, input().split())
c, d = map(int, input().split())
print(solve())
Recommended Posts