[AtCoder Erklärung] Kontrollieren Sie ABC158 A, B, C Probleme mit Python!

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.

ABC158-Daten

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>

Ein Problem (6954 Personen AC)
Die Lesefähigkeit wird getestet.
B-Problem (5837 AC)
Es ist schwierig. Es ist leicht zu verstehen, wenn Sie es auf Papier schreiben.
C-Problem (5456 Personen AC)
Es ist einfach, wenn Sie feststellen, dass Sie eine vollständige Suche (Round-Robin) um 1 Yen vom kleinsten durchführen können.
D-Problem (3533 Personen AC) [In diesem Artikel nicht erklärt] Die Simulation der
-Operation ist zu spät.

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.

Problemstellung

Problemstellung (Falz, Bild)
![158a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595910/16dcf824-5797-3686-5c66-9ed2ac66194a.png)

Einfach gesagt

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.

Wie löst man

  1. Entschlüsseln Sie die Problemstellung

Schritt 1: Entschlüsseln Sie die Problemstellung

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".

Code

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.

Problemstellung

Problemstellung (Falz, Bild)
![158b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595910/3e45f6ea-a4eb-2fe3-7c16-c1eb109dfce3.png)

Einfach gesagt

  • $ A $ und $ B $ sind schwer zu verstehen, ändern Sie sie also in $ Blue $ und $ Red $.

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?

Wie löst man

  1. Beachten Sie, dass die Schleife eingeschränkt und nicht rechtzeitig ist
  2. Überlegen Sie, wie Sie nach Formel berechnen

Schritt 1: Beachten Sie, dass die Schleife eingeschränkt und nicht rechtzeitig ist

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.

Schritt 2: Überlegen Sie, wie Sie nach Formel berechnen

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.

abc158bfig1.png

"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.

Gesamtzahl der blauen Kugeln im Zylinder

In einem Zylinder befinden sich $ Blue $ Blue Balls. Daher befinden sich in einer $ Q $ -Buchröhre $ Blue \ times Q $ blue Balls.

Anzahl der blauen Rosenkugeln

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.

abc158bfig2.png

Mit anderen Worten, der kleinere Wert von $ R $ und $ Blue $, $ min (Blue, R) $.

Gesamtzahl

Aus dem oben Gesagten ergibt sich die Anzahl der benötigten Bälle $ {N} \ div {(Blau + Rot)} = Q Wenn Sie R $ zu viel sagen

Blue \times Q + min(Blue, R)

Wird sein. Schreiben wir dies in den Code.

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.

Problemstellung

Problemstellung (Falz, Bild)
![158c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595910/67e2e6e7-acdb-0d4e-e17c-e0461019f687.png)

Dinge die zu tun sind

  1. Überlegen Sie, wie Sie fragen sollen

Schritt 1: Überlegen Sie, wie Sie fragen sollen

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.

Code

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

[AtCoder Erklärung] Kontrollieren Sie ABC180 A, B, C Probleme mit Python!
[AtCoder Erklärung] Kontrollieren Sie ABC158 A, B, C Probleme mit Python!
[AtCoder Erklärung] Kontrollieren Sie ABC164 A, B, C Probleme mit Python!
[AtCoder Erklärung] Kontrollieren Sie ABC168 A, B, C Probleme mit Python!
[Erklärung zum AtCoder] Kontrollieren Sie die A-, B- und C-Probleme von ABC182 mit Python!
[AtCoder Erklärung] Kontrollieren Sie ABC184 A, B, C Probleme mit Python!
[Erklärung zum AtCoder] Kontrollieren Sie die A-, B-, (C), D-Probleme von ABC165 mit Python!
[AtCoder-Erklärung] Kontrollieren Sie die A-, B-, C- und D-Probleme von ABC183 mit Python!
[Erklärung zum AtCoder] Kontrollieren Sie die A-, B-, C- und D-Probleme von ABC181 mit Python!
ABC126 A, B, C Erklärung (Python)
Fordern Sie AtCoder (ABC) 164 mit Python heraus! A ~ C Problem
Löse den Atcoder ABC176 (A, B, C, E) in Python
Löse ABC163 A ~ C mit Python
Löse ABC168 A ~ C mit Python
AtCoder ABC 114 C-755 mit Python3 gelöst
Löse ABC162 A ~ C mit Python
Löse ABC167 A ~ C mit Python
ABC128 A, B, C Kommentar (Python)
Löse ABC158 A ~ C mit Python
[AtCoder] Löse ABC1 ~ 100 Ein Problem mit Python
Löse AtCoder ABC168 mit Python (A ~ D)
AtCoder ABC 177 Python (A ~ E)
Löse AtCoder ABC166 mit Python
AtCoder ABC 178 Python (A ~ E)
ABC129 A, B, C Kommentar
AtCoder ABC 176 Python (A ~ E)
AtCoder ABC 182 Python (A ~ D)
AtCoder Anfängerwettbewerb 166 A Erklärung des Problems "A? C" (Python3, C ++, Java)
AtCoder Anfängerwettbewerb 174 B Problem "Entfernung" Erklärung (C ++, Python, Java)
AtCoder-Anfängerwettbewerb 177 B Problem "Teilzeichenfolge" Erläuterung (Python3, C ++, Java)
Löse ABC166 A ~ D mit Python
AtCoder Anfängerwettbewerb 167 Ein Problem "Registrierung" Erklärung (Python3, C ++, Java)
Beheben von AtCoder-Problemen Empfehlung mit Python (20200517-0523)
Löse ABC036 A ~ C mit Python
Lösen mit Ruby und Python AtCoder ABC011 C Dynamische Planungsmethode
Vorlage AtCoder ABC 179 Python (A ~ E)
Löse ABC037 A ~ C mit Python
AtCoder-Anfängerwettbewerb 169 B Problem "Multiplikation 2" Erläuterung (Python3, C ++, Java)
AtCoder Anfängerwettbewerb 170 Ein Problem "Fünf Variablen" Erklärung (C ++, Python, Java)
[AtCoder-Kommentar] Gewinnen Sie mit Python das ABC165 C-Problem "Many Requirements"!
AtCoder Beginner Contest 169 Eine Erklärung des Problems "Multiplikation 1" (Python3, C ++, Java)
AtCoder Beginner Contest 176 Eine Erklärung des Problems "Takoyaki" (Python3, C ++, Java)
AtCoder Anfängerwettbewerb 175 Ein Problem "Regenzeit" Erklärung (C ++, Python3, Java)
Lösen mit Ruby, Python und numpy AtCoder ABC054 B Matrixberechnung
Lösen mit Ruby, Perl, Java und Python AtCoder ABC 065 C-te Potenz
AtCoder-Anfängerwettbewerb 176 B Problem "Multiple of 9" Erläuterung (Python3, C ++, Java)
AtCoder Anfängerwettbewerb 174 Ein Problem "Klimaanlage" Erklärung (C ++, Python, Java)
[Python] [Erklärung] AtCoder Typischer DP-Wettbewerb: Ein Wettbewerb
Python> Schlüsselwortargumente> hoge (** {'a': 1, 'b': 2, 'c': 3})
Löse ABC165 A, B, D mit Python
AtCoder ABC 174 Python