AtCoder ABC168 Dies ist eine Zusammenfassung der Probleme des AtCoder-Anfängerwettbewerbs 168, der am 17.05.2020 (So) in der Reihenfolge von Problem A unter Berücksichtigung der Berücksichtigung stattfand. Das erste Halbjahr befasst sich mit Fragen bis ABC. Das Problem wird zitiert, aber bitte überprüfen Sie die Wettbewerbsseite für Details. Klicken Sie hier für die Wettbewerbsseite Offizieller Kommentar PDF
Problemstellung Iroha beschloss, Japanisch für ihre Katze Sunuke zu unterrichten, die das beliebte japanische Spiel "Åt Coder" spielen möchte. Beim Zählen von Stiften auf Japanisch wird "Buch" nach der Nummer als Hilfsnummer hinzugefügt. Diese Hilfsnummer wird je nach angehängter Nummer unterschiedlich gelesen. Insbesondere für eine positive ganze Zahl $ N $ unter 999 $ ist das Lesen von "Buch", wenn "$ N $ Buch" gesagt wird ・ Wenn $ 1 $ von $ N $ $ 2,4,5,7,9 $ ist, "hon" ・ Wenn $ 1 $ von $ N $ $ 0,1,6,8 $ ist, wird "pon" ・ "Bon", wenn der $ 1 $ Platz von $ N $ $ 3 $ ist . $ N $ ist angegeben, geben Sie also das Lesen des "Buches" aus, wenn Sie "$ N $ Buch" sagen.
Die Eingabe wird als Zahl empfangen, und der Rest nach Division durch 10 $ liegt in der Größenordnung von 1 $. Ich denke, es ist ein Fehler, aber um ihn so schnell wie möglich einzureichen, setze ich die Ausgabe von "hon" auf "else" (das Schreiben des bedingten Ausdrucks wird etwas kürzer).
abc168a.py
n = int(input())
k = n % 10
if k == 3:
print("bon")
elif k == 0 or k == 1 or k == 6 or k == 8:
print("pon")
else:
print("hon")
Problemstellung Es gibt eine Zeichenfolge $ S $, die aus Kleinbuchstaben besteht. Wenn die Länge von $ S $ kleiner als $ K $ ist, geben Sie $ S $ so aus, wie sie ist. Wenn die Länge von $ S $ länger als $ K $ ist, schneiden Sie nur das erste $ K $ -Zeichen aus und fügen Sie am Ende ... zur Ausgabe hinzu.
Vergleichen Sie vorerst die Länge von $ S $ mit $ K $ in der if-Anweisung und schreiben Sie die Verarbeitung, wenn sie das Folgende und das Ende überschreitet. Da Python Zeichenfolgen wie ein Array verarbeiten kann, habe ich es ohne Verwendung der for-Anweisung geschrieben.
abc168b.py
n = int(input())
s = input()
if len(s) <= n:
print(s)
else:
print(s[:n] + "...")
Problem B wurde in wenigen Minuten nach Beginn des Wettbewerbs gelöst, sodass ich es in meiner idealen Zeit lösen konnte.
Problemstellung Betrachten Sie eine analoge Uhr mit Stunden- und Minutenzeigern von $ A $ Zentimeter bzw. $ B $ Zentimeter. Jeweils ein Endpunkt des Stundenzeigers und des Minutenzeigers ist auf denselben Festpunkt festgelegt, und jeder Zeiger dreht sich mit einer konstanten Winkelgeschwindigkeit im Uhrzeigersinn um diesen Punkt. Der Stundenzeiger ist $ 12 $ Stunde und der Minutenzeiger ist $ 1 $ Stunde. Bei $ 0 $ überlappen sich die Stunden- und Minutenzeiger. Wie viele Zentimeter sind die nicht fixierten Endpunkte der $ 2 $ -Hände voneinander entfernt, wenn sie nur $ H $ Stunden und $ M $ Minuten erreichen?
Ich habe mir ein paar Möglichkeiten ausgedacht, um es zu lösen, aber ich habe es mit dem Kosinussatz gelöst. Der Wert $ D $, den Sie finden möchten, ist
D = \sqrt{A^2 + B^2 - 2AB\cos \theta}
Da es mit berechnet werden kann, kann es durch Berechnen von $ \ theta $ gelöst werden. Wenn die Winkel der Stunden- und Minutenzeiger von 0 Uhr bis zu den Zeigern im Uhrzeigersinn $ \ theta_A bzw. \ theta_B $ sind.
\theta_A = 30 \times H + 0.5 \times M \\
\theta_B = 6 \times M
Daher ist der Winkel $ \ theta $, der durch die Stunden- und Minutenzeiger gebildet wird
\theta = \theta_A - \theta_B
Sie können es mit finden. Hier ist es möglich, dass $ \ theta $ größer als $ 180 $ Grad oder negativ ist.
\cos (360 - x) = \cos x \\
\cos (-x) = \cos x
Daher kann die Länge problemlos durch Berechnung des Kosinussatzes berechnet werden.
abc168c.py
import math
a, b, h, m = map(int, input().split())
x = 30 * h + m / 2 - 6 * m
d = math.sqrt(a**2 + b**2 - 2 * a * b * math.cos(math.radians(x)))
print(d)
Eine andere Sache, die ich mir ausgedacht habe, war $ (A_x, A_y) = (A \ cos \ theta_1, A \ sin \ theta_1), (B_x, B_y) = (B \ cos \ theta_2, B) \ sin \ theta_2) $ und $ D $, die unter Verwendung des Drei-Quadrat-Theorems erhalten werden sollen, sind
D = \sqrt{(A_x - B_x)^2 + (A_y - B_y)^2}
Sie können es mit finden.
Ich habe den Kosinussatz verwendet, weil die Antwort eine positive reelle Zahl ist und es Einschränkungen für den absoluten oder relativen Fehler mit dem korrekten Wert gibt. Daher wusste ich nicht, wie viel Fehler bei der Berechnung von "math" auftreten würde, also habe ich ihn so oft wie möglich verwendet. Es wurde durch den Kosinussatz gelöst, der die Anzahl der Verwendungen reduzieren kann.
Dies ist das Ende der ersten Hälfte. Vielen Dank für das Lesen bis zum Ende der ersten Hälfte.
In der zweiten Hälfte wird das DEF-Problem erläutert. Fortsetzung in der zweiten Hälfte.
Recommended Posts