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

** AtCoder Beginners Contest 168 ** ** 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.

AtCoder Beginners Contest 168 Gesamtzahl der Einreichungen: 10866

Performance AC Ergebnis Zeit Rangfolge Richtlinie
400 ABC--- 600 62 Minuten 6607 Teeleistung
600 ABC--- 600 36 Minuten 5323 .. Teerate bei 8 mal
800 ABC--- 600 16 Minuten 4025 Grüne Leistung
1000 ABCD-- 1000 76 Minuten 2861 .. Green Rate bei 8 mal
1200 ABCD-- 1000 48 Minuten Wasserleistung

(Referenz) Me: 1244. Performance 1418 ss_4.png

Ein Problem (10686 Personen AC) "∴ (daher)"
Wenn Sie wissen, wie man den 1. Platz belegt, können Sie ihn lösen. Ich benutze es oft, also erinnern wir uns in 3 Sekunden daran.
B-Problem (10466 AC) "... (Triple Dots)"
Mit Python machen Sie es einfach.
C-Problem (7598 Personen AC) ": (Doppelpunkt)"
Erinnerst du dich an den Kosinussatz? Ich habe gegoogelt.
D-Problem (3856 Personen AC) ".. (Double Dots)" [In diesem Artikel nicht erklärt] Sie können eine BFS (Breitenprioritätssuche) von
1 aus durchführen. Die Antwort lautet immer JA.

Problem A "∴ (daher)"

** Problemseite **: A-∴ (daher) ** Schwierigkeit **: ★ ☆☆☆☆ ** Punkt **: Umgang mit Zeichenketten oder Umgang mit Resten

Wenn Sie die Stelle der angegebenen Nummer kennen, können Sie den Rest jeweils lösen.

A Ich denke, es ist ein wenig problematisch für das Problem. Infolgedessen ist es schneller, die Hand zu bewegen, bevor Sie darüber nachdenken.

  1. Denken Sie über die Implementierung nach

Schritt 1: Denken Sie über die Implementierung nach

Es gibt zwei Muster, um den 1. Platz zu finden.

Danach können Sie so etwas wie ~~ wenn c in ["0", "1", "6", "8"] tun: ~~ wenn c in" 0168 ". (Ich habe es geändert, weil es einfacher ist, Zeichenfolgen als Listen einzugeben.)

Code

Dies ist das Muster, das als Zeichenfolge empfangen wird. Das "hon" -Muster erfordert die Eingabe der meisten 5 Zeichen, was problematisch ist, so dass es etwas einfacher ist, es zu einem else-Block zu machen.

bon, pon, hon sind ähnlich und verwirrend. Beeilen Sie sich also nicht und überprüfen Sie sie sorgfältig, bevor Sie sie einreichen, um keine unnötige WA zu generieren.

(Wenn es sich jedoch um eine Zeichenfolge handelt, können Sie sofort "24579" eingeben, sodass es möglicherweise schwieriger ist, einen Fehler zu machen, wenn Sie ihn in der Reihenfolge der Problemstellung schreiben.) </ font>

n = input()
c = n[-1]

if c in "3":
    print("bon")
elif c in "0168":
    print("pon")
else:
    print("hon")

Hier ist ein Muster, das eine ganze Zahl annimmt und den Platz der 1 durch den Rest findet, nachdem es durch 10 geteilt wurde.

n = int(input())
c = n % 10

if c in [3]:
    print("bon")
elif c in [0, 1, 6, 8]:
    print("pon")
else:
    print("hon")

Problem B "... (dreifache Punkte)"

** Problemseite **: B -... (Triple Dots) ** Schwierigkeit **: ★ ☆☆☆☆ ** Punkt **: Umgang mit Zeichenketten

Python ist super einfach. Danke an Python.

Wie löst man

  1. Denken Sie über die Implementierung nach

Schritt 1: Denken Sie über die Implementierung nach

Lassen Sie uns vorerst die Länge der Zeichenfolge ermitteln. Dies ist ein Schuss mit l = len (s ).

Wenn if l <= k:, kann es so ausgegeben werden, wie es ist, also ist es print (s).

Wenn nicht, schneiden Sie das erste $ K $ -Zeichen aus und fügen Sie am Ende der Ausgabe "..." hinzu. Das heißt, print (s [: k] + '...'). s [: k] ist das 0. bis k-1. Zeichen von s, also ist die Summe k Zeichen.

Code

Vorsichtshalber ist es besser, das "..." aus der Problemstellung zu kopieren und einzufügen.

Ich habe einen Fehler gemacht und "". .. .. Es kann nicht gesagt werden, dass die Möglichkeit besteht, WA durch Schreiben von "" oder "..." auszugeben.

    k = int(input())
    s = input()

    l = len(s)

    if l <= k:
        print(s)
    else:
        print(s[:k]+'...')

C Problem ": (Doppelpunkt)"

** Problemseite **: C-: (Doppelpunkt) ** Schwierigkeit **: ★★★★ ☆ (Es gibt individuelle Unterschiede) ** Punkt **: Kenntnisse in Mathematik, Bogenmaß und Frequenzmethode

Es ist ein Mathematikproblem der High School. Verwenden Sie den Kosinussatz.

Für solche mathematischen Probleme kann es zweckmäßig sein, einen Funktionsrechner zur Hand zu haben.

Auch wenn Sie keinen haben, verfügt der mit Windows gelieferte Taschenrechner über einen Funktionsrechnermodus. Oder Suche mit Funktionsrechner mit Google-SucheDu darfst.

Mathematikprobleme sind von Person zu Person sehr unterschiedlich. Die Schwierigkeit von AtCoder-Problemen betrug 107, aber es gibt einige Leute, die es nicht einmal mit Wasser oder blauem Codierer lösen konnten. Es ist also in Ordnung, wenn Sie es nicht tun können. ist.

Um bestimmte Zahlen anzugeben, sind die AC / Teilnehmer Wasser 702/742 und Blau 333/350. Man kann sagen, dass die Leute in diesem Ratenband ganz besondere Probleme hatten, weil fast alle von ihnen AC für das übliche C-Problem waren.

Wie löst man

  1. Denken Sie über die Lösung nach
  2. Finden Sie den Winkel zwischen den Nadeln
  3. Seien Sie vorsichtig bei der Verwendung der Python-Cos-Funktion (ändern Sie die Frequenz in Bogenmaß).
  4. Nehmen Sie die Route richtig

Schritt 1: Denken Sie über die Lösung nach

Es gibt zwei Möglichkeiten, dies zu lösen.

--Berechnen Sie mit dem Kosinussatz --Finden Sie die Koordinaten der Nadel und verwenden Sie den Drei-Quadrat-Satz

Die meisten Leute machen es mit dem Kosinussatz, deshalb werde ich es hier erklären. In der Tat sollten Leute, die durch Koordinaten herausfinden wollen, gut in Mathematik sein, so dass es nicht nötig ist, diese Erklärung zu lesen.

Der Kosinussatz, den ich in der High School gemacht habe, ist eine Formel zum Ermitteln der Länge der verbleibenden einen Seite von den beiden Seiten des Dreiecks und des Winkels zwischen ihnen.

c^{2} = a^{2} + b^{2} - 2abcos{θ}

Da $ a $ und $ b $ als Längen der Stunden- bzw. Minutenzeiger angegeben werden, können sie gelöst werden, indem der Winkel $ θ $ zwischen den Stunden- und Minutenzeigern bekannt ist.

Wenn Sie motiviert sind, würde ich ein Diagramm zeichnen, aber es ist problematisch, also [Google-Cosinussatz und Suche](https://www.google.com/search?q=%E4%BD%99%E5%BC%A6%] E5% AE% 9A% E7% 90% 86) Sie erhalten viele schöne Bilder.

Schritt 2: Finden Sie den Winkel zwischen den Nadeln

Wie finde ich den Winkel zwischen den Nadeln?

Finden Sie die Winkel der Minuten- und Stundenzeiger, wobei der Scheitelpunkt um 00:00 Uhr 0 Grad beträgt. Ziehen Sie dann den anderen Winkel von dem, der sich vorwärts bewegt.

Wenn beispielsweise der Stundenzeiger 15 Grad und der Minutenzeiger 60 Grad beträgt, sind 60-15 = 45 Grad. (Da es sich um eine angemessene Zahl handelt, denke ich nicht, dass dies bei einer echten Uhr ein solcher Winkel sein wird.)

Minutenzeigerwinkel

Da es in 60 Minuten 360 Grad ist, rückt es in 1 Minute um 360 ÷ 60 = 6 Grad vor.

Stundenzeigerwinkel

Da es in 12 Stunden 360 Grad ist, rückt es in 1 Stunde um 360 ÷ 12 = 30 Grad vor. Denken Sie jedoch daran, dass es in Minuten voranschreitet, genau wie eine echte Uhr.

Es ist einfacher zu verstehen, wenn Sie denken, dass 60 Minuten x 12 Stunden = 720 Minuten 360 Grad und 1 Minute 360 ÷ 720 = 0,5 Grad sind. Zum Beispiel um 9:45 Uhr 9 x 60 + 45 = 585 Minuten und 585 x 0,5 = 292,5 Grad.

Sie müssen es nicht in einem scharfen Winkel befestigen

Angenommen, der Stundenzeiger beträgt 5 Grad und der Minutenzeiger 350 Grad. (Dieser Winkel ist auch angemessen)

Zu diesem Zeitpunkt sind 350-5 = 345 Grad, aber ich habe das Gefühl, dass zwischen den Nadeln ein scharfer Winkel von 15 Grad besteht.

Es ist jedoch in Ordnung, mit einem stumpfen Winkel von 345 Grad zu rechnen. Dies liegt daran, dass $ cos (θ) = cos (360 ° -θ) $ ist. Wenn Sie sich an den Einheitskreis erinnern, können Sie ihn verstehen, indem Sie sich daran erinnern. Weitere Informationen finden Sie auf der Website, auf der die Mathematik richtig erklärt wird.

Außerdem habe ich dies vergessen und versucht zu konvertieren, und ich habe fälschlicherweise 1WA bei der Konvertierung ausgegeben.

Schritt 3: Achten Sie auf die Verwendung der cos-Funktion von Python (ändern Sie die Frequenz in Bogenmaß).

Das Modul math hat eine eigene Funktion,math.cos ().

Fügen Sie jedoch nicht den Winkel, den Sie gerade gefunden haben, in die Funktion math.cos () ein. Dies liegt daran, dass die Eingabe der Funktion math.cos () im Bogenmaß erfolgt ($ \ pi = 180 ^ \ circ $).

Sie müssen sich nicht die Mühe machen, die Definition von Radian zu berechnen oder sich daran zu erinnern. Mit der Funktion "math.radians ()" können Sie Frequenzen in Bogenmaß umwandeln.

Schritt 4: Nehmen Sie die Route richtig

Ich werde es noch einmal schreiben, aber die Formel des Kosinussatzes lautet

c^{2} = a^{2} + b^{2} - 2abcos{θ}

ist.

Sie werden nach $ c ^ {2} $ gefragt. Nehmen wir also die Route richtig und machen Sie sie zu $ c $.

Code

"Subtrahieren Sie den Winkel der anderen Nadel vom Winkel der vorrückenden Nadel" ist dasselbe wie den "absoluten Wert der Differenz" zu nehmen, also habe ich das geschrieben. (Eigentlich ist es okay, wenn Sie dies nicht tun und es wird negativ)

import math

a, b, h, m = list(map(int, input().split()))
deg_a = (60 * h + m) * (360 / (60 * 12))
deg_b = m * (360 / 60)
deg = abs(deg_a - deg_b)
rad = math.radians(deg)

c2 = a ** 2 + b ** 2 - 2 * a * b * math.cos(rad)
print(c2 ** 0.5)

Nebenbei: Sie können es negativ lassen

Wie ich zuvor geschrieben habe, wird als "abs (deg_a --deg_b)" der Wert berechnet, der durch Subtrahieren des Winkels der Nadel, die nicht vorrückt, vom Winkel der Nadel, die vorrückt, berechnet wird, aber es ist in Ordnung, mit Minus zu berechnen.

Dies liegt an der Natur der Dreiecksfunktion. Sie können es von Google sehen.

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!
[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!
ABC127 A, B, C Erklärung (Python)
ABC126 A, B, C Erklärung (Python)
Löse den Atcoder ABC176 (A, B, C, E) in Python
Löse ABC168 A ~ C mit Python
AtCoder ABC 114 C-755 mit Python3 gelöst
Löse ABC162 A ~ C mit Python
ABC128 A, B, C Kommentar (Python)
Löse ABC158 A ~ C mit Python
Löse ABC175 A, B, C mit Python
[AtCoder] Löse ABC1 ~ 100 Ein Problem mit Python
Löse AtCoder ABC168 mit Python (A ~ D)
[AtCoder] Lösen Sie ein Problem von ABC101 ~ 169 mit Python
AtCoder ABC 177 Python (A ~ E)
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 174 B Problem "Entfernung" Erklärung (C ++, Python, Java)
Löse ABC166 A ~ D mit Python
ABC166 in Python A ~ C Problem
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 B Problem "Making Triangle" Erklärung (C ++, Python3, 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
AtCoder ABC 175 Python
Lösen mit Ruby und Python AtCoder ABC057 C Zerlegung des Primfaktors Bit vollständige Suche
AtCoder-Anfängerwettbewerb 173 B Problem "Zusammenfassung des Richterstatus" Erläuterung (Python3, C ++, Java)