Wir werden erklären, wie man A-, B-, C-Probleme des ** AtCoder Beginners Contest 158 ** mit ** Python 3 ** für Anfänger so sorgfältig wie möglich löst.
Ich möchte eine Lösung erklären, die die folgenden drei Punkte erfüllt, nicht nur eine Methode, die gelöst werden kann.
Datum: 2020-03-07 (Sa) 21:00 ~ 2020-03-07 (Sa) 22:40 (100 Minuten) Eine Anzahl von Personen, die Fragen stellen: 7053
Performance | AC | Zeit | Rangfolge | Richtlinie |
---|---|---|---|---|
400 | ABC- | 63 Minuten | 4580 | Teeleistung |
600 | ABC- | 23 Minuten | 3766 | Brown Rate bei 8 mal |
800 | ABCD | 90 Minuten | 2911. Platz | Grüne Leistung |
(Referenz) I: Leistung 1144 ABCD-- 44:24 (1WA) 1644. Platz </ font>
ABC158A 『Station and Bus』
** Problemseite **: A - Station und Bus ** Schwierigkeit **: ★ ☆☆☆☆ ** Punkt **: String-Operation
Selbst wenn ich nur die Problemstellung lese, weiß ich nicht, was ich tun soll. In einem solchen Fall ist es vorerst gut, ein konkretes Beispiel mit einer Stichprobe zu sehen.
Es gibt eine dreistellige Zeichenfolge $ S $ mit nur "A" oder "B". Dies ist eine Zeichenfolge, die die Betreiber der drei Stationen in der Stadt AtCoder darstellt. Zum Beispiel werden im Fall von "ABA" Station 1 und Station 3 von Firma A betrieben, und Station 2 wird von Firma B betrieben.
Die Stationen verschiedener Betreiberunternehmen haben unterschiedliche Routen, so dass der Transport unpraktisch ist. Deshalb habe ich mich entschlossen, einen Bus zwischen den Bahnhöfen der Firma A und der Firma B zu betreiben.
Es gibt jedoch nicht immer eine Kombination von Stationen, an denen Busse tatsächlich verkehren. Insbesondere wenn alle drei Stationen in der Stadt Stationen desselben Unternehmens sind, gibt es keine Stationen, die von Bussen betrieben werden.
Stellen Sie fest, ob der Bus tatsächlich fährt.
Sie müssen Ihre Vorstellungskraft während des Wettbewerbs nicht auf die oben genannten Ebenen anwenden, aber das Vorstellen und Schreiben bestimmter Situationen kann Ihnen beim Verständnis helfen.
Wenn es zwei Arten von $ S $ gibt, wie "ABA", "ABB", "A" und "B", dann "Ja". Wenn $ S $ nur ein Zeichen hat, dh "AAA" oder "BBB", ist es "Nein".
Da die Anzahl der Zeichen auf 3 festgelegt ist, ist es einfach, "AAA" und "BBB" direkt einzugeben.
Achten Sie darauf, "Nein" und "Ja" nicht zu verwechseln und sie umzukehren. Wenn Sie sicherstellen, dass die Probe jedes Mal bestanden wird, bevor Sie sie einreichen, verlieren Sie versehentlich die WA.
s = input()
if s == "AAA" or s == "BBB":
print("No")
else:
print("Yes")
Wenn die Anzahl der Zeichen nicht festgelegt ist, z. B. 1 Million Zeichen, und Sie nicht direkt eingeben können, empfiehlt es sich, eine Zeichenfolge mit dem folgenden Code zu erstellen.
s = input()
n = len(s) #s Länge n
a_only = "A" * n #Eine Zeichenfolge gefolgt von n Zeichen
b_only = "B" * n #Eine Zeichenfolge, in der B für n Zeichen fortgesetzt wird
if s == a_only or s == b_only:
print("No")
else:
print("Yes")
Oder Sie können len (set (s))
verwenden. Ich werde es diesmal nicht erklären, aber es ist nützlich, sich daran zu erinnern.
s = input()
num = len(set(s)) #Wenn Sie in einen festgelegten Typ konvertieren, verschwindet die Duplizierung, sodass Sie die Anzahl der Typen mit len anzeigen können
if num == 1:
print("No")
else:
print("Yes")
ABC158B『Count Balls』
** Problemseite **: B --Count Balls ** Schwierigkeit **: ★★★★★ ** Punkt **: Ganzzahl (Quotient und Rest der Division), Berechnungsbetrag
Es ist der höchste Schwierigkeitsgrad als B-Problem.
Die Operation von 10 bis zur 100. Potenz des Problemsatzes, das Maximum der Einschränkung ist 10 bis zur 18. Potenz, und es kommt eine unvorstellbar große Zahl heraus. Der Mensch kann sich eine so große Zahl nicht speziell vorstellen. Wenn Sie es versuchen, wird es verwirrend sein, also behandeln Sie es mechanisch und abstrakt.
Wenn Sie die Problemstellung lesen und ein wenig nachdenken, können Sie sehen, dass die geschriebene Zehnerpotenz "im Wesentlichen unendlich" und "groß genug" bedeutet und die Zahl selbst keine Bedeutung hat.
Bilden Sie eine unendlich lange Reihe von Bällen, indem Sie $ Blue $ blue Bälle und $ Red $ red Bälle abwechseln.
Geben Sie $ N $ im Bereich von> 1 oder mehr und 100 kyo (= 10.000 mal 100 Billionen) oder weniger an. Wie viele blaue Kugeln aus $ N $ vom Anfang der Reihe der Kugeln?
Wenn Sie den Vorgang mit einer while-Schleife simulieren, erhalten Sie natürlich die Antwort. Das Problem ist jedoch, dass $ N $ bis zu 100.000 betragen kann. Selbst wenn Sie einen PC verwenden, dauert es ohne Übertreibung mehrere Jahre bis mehrere Jahrzehnte. Sie müssen ihn also auf andere Weise finden.
Was zu tun ist, können Sie in einem Schuss berechnen, indem Sie "Division of Integers" (Division mit Resten in der mittleren Klasse der Grundschule) verwenden.
Wenn Sie sich "die Operation des Hinzufügens von $ Blue $ Blue Balls und $ Red $ Red Balls" als einen Satz vorstellen, können Sie nach Division berechnen. Lassen Sie uns die Operation ein wenig umformulieren.
Betrachten Sie den Vorgang des Hinzufügens von "einem Zylinder mit $ blauen $ blauen Kugeln und $ roten $ roten Kugeln" nacheinander zur Reihe.
Wenn Sie jedoch den Zylinder so hinzufügen, wie er ist, und die Anzahl der Kugeln in der Reihe $ N $ überschreitet, entfernen wir die Kugeln einzeln aus dem Zylinder und fügen sie der Reihe hinzu. Zu diesem Zeitpunkt kommt die blaue Kugel zuerst aus dem Zylinder.
Vergessen Sie die Farbe der Kugeln und finden Sie die $ Q $ Anzahl der Zylinder mit $ (Blau + Rot) $ Kugeln und die $ R $ Anzahl der losen Kugeln. Sobald Sie dies wissen, können Sie leicht die Anzahl der blauen Kugeln berechnen.
"Anzahl der Zylinder $ Q $" und "Anzahl der Rosenkugeln $ R $" bedeutet "Gesamtzahl der Kugeln $ N $" und "Anzahl der Kugeln pro Zylinder $ (Blau + Rot) $" Sie wird durch Teilen durch berechnet.
{N} \div {(Blue + Red)} =Q auch R.
Die "Gesamtzahl der blauen Kugeln", die Sie finden möchten, ist "Gesamtzahl der blauen Kugeln im Zylinder" + "Anzahl der blauen Kugeln aus Rosen", sodass Sie jede einzelne berechnen und addieren können.
In einem Zylinder befinden sich $ Blue $ Blue Balls. Daher befinden sich in einer $ Q $ -Buchröhre $ Blue \ times Q $ blue Balls.
Da nur eine Röhre geöffnet werden kann, beträgt die maximale Anzahl an blauen Kugeln aus $ R $ Rosenkugeln $ Blau $. Mit anderen Worten, es ist im Grunde $ R $, aber wenn $ R $ $ Blue $ überschreitet, wie in der Abbildung unten gezeigt, sollte es $ Blue $ sein.
Mit anderen Worten, der kleinere Wert von $ R $ und $ Blue $, $ min (Blue, R) $.
Aus dem oben Gesagten ergibt sich die Anzahl der benötigten Bälle $ {N} \ div {(Blau + Rot)} = Q Wenn Sie R $ zu viel sagen
Wird sein. Schreiben wir dies in den Code.
n, blue, red = list(map(int, input().split()))
# n / (blue + red) = quot ... rem
quot = n // (blue + red) #Handelsquotient
rem = n % (blue + red) #Rest Rest
ans = blue * quot + min(blue, rem)
print(ans)
Bei einfachen Problemen kann der Variablenname ein einzelner Buchstabe "a", "b" oder "x" sein. Bei komplexen Problemen ist es jedoch besser, einen Namen zu haben, der angibt, um welche Variable es sich handelt.
Ich suchte und schrieb, dass das englische Wort für Quotient "Quotient" ist. Es ist Zeitverschwendung, während des Wettbewerbs nachzuschlagen, sodass Sie "sho" oder "amari" in römischen Buchstaben verwenden können.
ABC158C『Tax Increase』 ** Problemseite **: C - Steuererhöhung ** Schwierigkeit **: ★★ ☆☆☆ ** Punkt **: So suchen Sie alle (runden), behandeln Schleifen und schneiden ab
Es ist eine Frage der Verbrauchssteuer. Ich denke, es ist einfacher als das B-Problem, weil es leicht konkret vorstellbar und nicht schwer umzusetzen ist.
Da die Obergrenze der Verbrauchsteuer nur 100 Yen beträgt, erscheint es gut, sie durch vollständige Suche (Round-Robin) zu überprüfen. Wenn die Verbrauchssteuer 100 Yen beträgt, beträgt der steuerlich ausgeschlossene Preis für den spezifischen Bereich 1250 Yen bis 1262 Yen, wenn er 8% beträgt, und 1000 Yen bis 1009 Yen, wenn er 10% beträgt. Sie können also jeweils 1 Yen von 0 Yen bis 1009 Yen prüfen. ist.
Sie müssen nicht nach dieser Obergrenze von 1009 Yen fragen. Es ist mühsam, danach zu fragen, und es verursacht Fehler, so dass es einfach und sicher ist, bis zu 10.000 Yen zu überprüfen.
a, b = list(map(int, input().split()))
ans = -1 #Wenn Sie die Antwort nicht finden können-Setzen Sie 1 auf den Anfangswert
#Überprüfen Sie dies, indem Sie 1 Yen von 0 Yen auf 9999 Yen erhöhen
for price in range(10000):
#8 Verbrauchsteuer%Und 10%Berechnen Sie jeweils
tax_a = int(price * 0.08)
tax_b = int(price * 0.1)
#Wenn die Bedingung erfüllt ist, weisen Sie sie der Antwort zu und verlassen Sie die Schleife
if tax_a == a and tax_b == b:
ans = price
break
#Wenn die Antwort gefunden wird, der Wert zu diesem Zeitpunkt, falls nicht gefunden, der Anfangswert-1 wird angezeigt
print(ans)
Ich muss nur den Mindestwert finden, also erhöhe ich ihn um 1 Yen und wenn ich ihn finde, versuche ich, aus der Schleife herauszukommen.
Dieses Mal habe ich Integrierte Funktion int function für die Kürzungsverarbeitung verwendet, aber aus dem Mathe-Import-Floor Sie können auch
schreiben und die [Mathe-Modul-Floor-Funktion] verwenden (https://docs.python.org/ja/3/library/math.html?highlight=math#math.floor). Die beiden verhalten sich bei negativen Zahlen unterschiedlich, sind jedoch für dieses Problem nicht relevant.
Recommended Posts