Rückblick auf den AtCoder Beginner Contest 164 bis Frage E (Python)

Dies ist ein Übersichtsartikel für Anfänger von Wettkampfprofis.

Die Lösung, die ich hier schreibe, wurde geschrieben, während ich mir den Kommentar und die Beiträge anderer Leute ansah. Es ist möglicherweise nicht das, was Sie tatsächlich eingereicht haben.

A - Sheep and Wolves

S Schaf und W Wolf, Gewinnen ist eine Frage, die gestellt werden muss.

Wenn S größer als W ist, werden die Schafe nicht angegriffen.

S, W = map(int, input().split())
if S > W:
    print('safe')
else:
    print('unsafe')

B - Battle

Es ist eine Frage zu beantworten, welche gewinnt, wenn sich die Angriffskraft B mit physischer Stärke A und die Angriffskraft D mit physischer Stärke C treffen.

Takahashi-kun und Aoki-kun benötigen jeweils die Anzahl der Angriffe, aufgerundet auf $ C / B $ und $ A / D $. Der mit der kleineren Anzahl gewinnt. Auch wenn die Zahlen gleich sind, ist Takahashi, der zuerst geschlagen werden kann, vorteilhaft.

Ich habe es mit der obigen Idee umgesetzt. Ich habe math.ceil () für den Aufrundungsprozess verwendet. Wenn Sie etwas wie (C + (B-1)) // B schreiben, benötigen Sie keine Bibliothek.

import math
A, B, C, D = map(int, input().split())
if math.ceil(C/B) <= math.ceil(A/D):
  print('Yes')
else:
  print('No')

C - gacha

Es ist ein Problem zu zählen, wie viele Arten von Zeichenketten $ S_i $ N-mal eingegeben werden.

Ich legte es in ein Objekt vom Typ Set und zählte die Länge.

N = int(input())
S = [input() for _ in range(N)]
print(len(set(S)))

D - Multiple of 2019

Es ist eine Frage, wie viele Zahlen bis 2019 teilbar gemacht werden können, wenn die Eingangsnummer S in einem beliebigen Abschnitt herausgeschnitten wird.

Ich dachte, es sei ein ähnliches Thema wie this und schrieb den folgenden Code. (Eigentlich konnte ich es während des Wettbewerbs nicht machen, weil ich einen Fehler gemacht oder die Zeit nicht verkürzt habe.)

import collections
S = input()
N = len(S)
M = [0]
mod = 0
ten = 1
for s in S[::-1]:
  mod += (int(s) * ten) % 2019
  mod %= 2019
  M.append(mod)
  ten *= 10
  ten %= 2019 
count = collections.Counter(M)
print(sum([c*(c-1)//2 for c in count.values()]))

Wenn beispielsweise eine Zahl "1234567" vorhanden ist, berechnet dieser Prozess den Überschuss von "7", "67", "567", "4567", "34567", "234567" und "1234567", und der Überschuss stimmt überein. Wenn mehrere Ziffern vorhanden sind, ist der Abschnitt teilbar.

Bei der eigentlichen Verarbeitung wird die Berechnungszeit gespart, indem sie häufig geteilt und die Überschussberechnung durchgeführt wird.

Eine ausführliche mathematische Erklärung finden Sie in Frage E in Artikel, den ich zuvor geschrieben habe.

E - Two Currencies

Das Problem besteht darin, den kürzesten Weg von Station 1 zu allen Stationen zu finden. Sie benötigen jedoch Silbermünzen, um den Zug zu benutzen, und Sie müssen an jedem Bahnhof unterschiedliche Zeit damit verbringen, Geld auszutauschen.

Bisher hat ABC nur Frage E beantwortet, aber dies ist fast das erste Mal für ein solides Diagrammproblem. Ich habe es überhaupt nicht verstanden und aufgegeben.

Ich habe viele Erklärungen und andere Antworten gesehen.

Erstens beträgt aufgrund des Limits von $ 2 \ leq N \ leq 50 $, $ 1 \ leq A_i \ leq 50 $ die Gesamtzahl der Silbermünzen, die von diesem System getragen werden können, $ 49 \ times50 = 2450 $. (Diese Zahl kann in Abhängigkeit von den tatsächlichen Werten von "N" und "A" weiter verringert werden. Der Einfachheit halber wird diese Zahl jedoch erläutert.)

"Mindestzeit $ T $ beim Halten von Münzen an Station n" wird im folgenden Array gespeichert.

T[n][coins]

Sie können es wie folgt erstellen. Geben Sie als Anfangswert einen ausreichend großen Wert ein.

T = [[10**18 for _ in range(2451)] for _ in range(N)]

Mögliche Verhaltensmuster für jede Station sind "Kosten" -Kostenblätter, Zeit $ t $, um zur benachbarten Station $ m $ zu gelangen "" Zeit $ t $, um Goldmünzen an derselben Station zu verwenden -Es bleibt keine andere Wahl, als gegen "Kosten" zu tauschen (gehen Sie zu $ m = n $ und denken Sie, dass Sie negative "Kosten" verbraucht haben). Behandle dieses Verhalten als Taple.

(m, cost, t)

Speichern Sie diesen Taple als Array für jede Station $ n $.

act[n] = [(Aktion 1), (Aktion 2), (Aktion 3), ....]

Der folgende Code speichert die eingegebenen Werte in diesen.

N, M, S = map(int, input().split())

act = [[] for _ in range(N)]


for i in range(M):
  U, V, A, B = map(int, input().split())
  U -= 1
  V -= 1
  act[U] += [(V, A, B)]
  act[V] += [(U, A, B)]

for i in range(N):
  C, D = tuple(map(int, input().split()))
  act[i] += [(i, -C, D)]

Da die Suche von hier aus durchgeführt wird, wird der Status der Suchquelle in der Prioritätswarteschlange gespeichert. Behandle einen Zustand als Taple. Die aktuelle Zeit $ currentT $, die aktuelle Station $ n $ und die Anzahl der im Besitz befindlichen Silbermünzen $ coin $ werden wie folgt ausgedrückt.

(currentT, n, coins)

Der Anfangszustand der Prioritätswarteschlange ist wie folgt.

que = [(0, 0, S)]

Das zweidimensionale Array "T" wird gefüllt, indem aus dieser Warteschlange in aufsteigender Reihenfolge von t extrahiert und eine Suche durchgeführt wird. Wenn Sie schließlich den kleinsten Wert in T [n] herausnehmen, stellt dies die minimale Zeit dar, um Station n zu erreichen.

Dann ist der durchgeschriebene Code wie folgt.

from heapq import *

N, M, S = map(int, input().split())

T = [[10**18 for _ in range(2451)] for _ in range(N)]

act = [[] for _ in range(N)]

for i in range(M):
  U, V, A, B = map(int, input().split())
  U -= 1
  V -= 1
  act[U] += [(V, A, B)]
  act[V] += [(U, A, B)]

for i in range(N):
  C, D = tuple(map(int, input().split()))
  act[i] += [(i, -C, D)]

que = [(0, 0, S)]

while que:
  (currentT, n, coins) = heappop(que)
  for m, cost, t in act[n]:
    #Wenn "zu dem Betrag, den Sie bezahlen können" "Mindestzeit T"[Ziel][Besitzgeld]Aktualisieren Sie den Wert, wenn Sie ihn aktualisieren können, und fügen Sie den Status der Warteschlange hinzu.
    #Wenn das Ergebnis des Austauschs 2450 überschreitet, behandeln Sie es als 2450 und es gibt kein Problem.
    if coins >= cost and currentT + t < T[m][min(2450, coins - cost)]:
      T[m][min(2450, coins - cost)] = currentT + t
      heappush(que, (currentT + t, m, min(2450, coins - cost)))

for i in range(1, N):
  print(min(T[i]))

Es scheint, dass es sich um einen Algorithmus handelt, der als Dyxtra-Methode bezeichnet wird. Ich hatte das Gefühl, dass es ein schwieriges Problem für Frage E war, aber ich war überrascht, dass der Algorithmus für den letzten Suchteil extrem einfach zu schreiben war.

Das ist alles für diesen Artikel.

Recommended Posts

Rückblick auf den AtCoder Beginner Contest 159 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 163 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 164 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 162 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 154 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 153 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 160 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 167 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 157 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 161 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 155 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 156 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 166 bis Frage E (Python)
Rückblick auf den AtCoder Beginner Contest 165 bis Frage E (Python)
Überprüfung des Atcoders ABC158 bis Frage E (Python)
AtCoder Beginner Contest 102 Rückblick auf frühere Fragen
AtCoder Beginner Contest 072 Rückblick auf frühere Fragen
AtCoder Beginner Contest 085 Rückblick auf frühere Fragen
AtCoder Beginner Contest 062 Rückblick auf frühere Fragen
AtCoder Beginner Contest 113 Rückblick auf frühere Fragen
AtCoder Beginner Contest 074 Rückblick auf frühere Fragen
AtCoder Beginner Contest 051 Rückblick auf frühere Fragen
AtCoder Beginner Contest 127 Rückblick auf frühere Fragen
AtCoder Beginner Contest 119 Rückblick auf frühere Fragen
AtCoder Beginner Contest 151 Rückblick auf frühere Fragen
AtCoder Beginner Contest 075 Rückblick auf frühere Fragen
AtCoder Beginner Contest 054 Rückblick auf frühere Fragen
AtCoder Beginner Contest 110 Rückblick auf frühere Fragen
AtCoder Beginner Contest 117 Rückblick auf frühere Fragen
AtCoder Beginner Contest 070 Rückblick auf frühere Fragen
AtCoder Beginner Contest 112 Rückblick auf frühere Fragen
AtCoder Beginner Contest 076 Rückblick auf frühere Fragen
AtCoder Beginner Contest 089 Rückblick auf frühere Fragen
AtCoder Beginner Contest 069 Rückblick auf frühere Fragen
AtCoder Beginner Contest 079 Rückblick auf frühere Fragen
AtCoder Beginner Contest 056 Rückblick auf frühere Fragen
AtCoder Beginner Contest 087 Rückblick auf frühere Fragen
AtCoder Beginner Contest 067 Rückblick auf frühere Fragen
AtCoder Beginner Contest 093 Rückblick auf frühere Fragen
AtCoder Beginner Contest 046 Rückblick auf frühere Fragen
AtCoder Beginner Contest 123 Überprüfung früherer Fragen
AtCoder Beginner Contest 049 Rückblick auf frühere Fragen
AtCoder Beginner Contest 078 Rückblick auf frühere Fragen
AtCoder Beginner Contest 081 Rückblick auf frühere Fragen
AtCoder Beginner Contest 047 Rückblick auf frühere Fragen
AtCoder Beginner Contest 060 Rückblick auf frühere Fragen
AtCoder Beginner Contest 104 Rückblick auf frühere Fragen
AtCoder Beginner Contest 057 Rückblick auf frühere Fragen
AtCoder Beginner Contest 121 Rückblick auf frühere Fragen
AtCoder Beginner Contest 126 Rückblick auf frühere Fragen
AtCoder Beginner Contest 090 Rückblick auf frühere Fragen
AtCoder Beginner Contest 103 Rückblick auf frühere Fragen
AtCoder Beginner Contest 061 Rückblick auf frühere Fragen
AtCoder Beginner Contest 059 Rückblick auf frühere Fragen
AtCoder Beginner Contest 044 Rückblick auf frühere Fragen
AtCoder Beginner Contest 083 Rückblick auf frühere Fragen
AtCoder Beginner Contest 048 Rückblick auf frühere Fragen
AtCoder Beginner Contest 124 Rückblick auf frühere Fragen
AtCoder Beginner Contest 116 Rückblick auf frühere Fragen
AtCoder Beginner Contest 097 Rückblick auf frühere Fragen
AtCoder Beginner Contest 088 Rückblick auf frühere Fragen