[PYTHON] Zusammenfassung der AtCoder C-Probleme, die in der Mathematik der High School gelöst werden können

Dieser Artikel ist ein Artikel (16. Tag) von Yugen Club Adventskalender 2019. ** Enthält Spoiler zur Lösung des AtCoder-Anfängerwettbewerbs. ** Bitte seien Sie beim Lesen vorsichtig.

Sie können nur mit der Kraft der Mathematik hellblau werden

Es ist fujioka_math, der im Sommer 27 Mal teilgenommen hat. Ich wollte meinem Leben etwas Spaß machen, also startete ich AtCoder, was die Leute um mich herum taten. graph.png Es wurde in ungefähr 5 Monaten hellblau. (Das Bild ist vom 16.12. Das Konto ist fujioka_1115)

Es wurde hellblau, aber ehrlich gesagt bin ich mit dem Algorithmus überhaupt nicht vertraut. Es fühlt sich so an, als hätte ich die Grenze erreicht, ohne das ABC E-Problem zu lösen, indem ich schnell ein Problem gelöst habe, das einfach mit der Kraft der Mathematik gelöst werden kann.

Mit mathematischer Kraft schieben

Die C- und D-Probleme von ABC weisen einige Probleme auf, die auch dann gelöst werden können, wenn Sie mit dem Algorithmus nicht vertraut sind. Zum Beispiel so etwas.

Problem anzeigen
ABC144 D - [Water Bottle](https://atcoder.jp/contests/abc144/tasks/abc144_d) ** [Zusammenfassung des Problems] ** Ein rechteckiger Behälter mit einem Boden von $ a \ mal a $ und einer Höhe von $ b $ enthält $ x $ Wasser. Wie oft kann ein Behälter beim Kippen (mit einer Seite eines Quadrats als Achse) ohne überlaufendes Wasser maximal gekippt werden?
Beispielantworten anzeigen
Dies ist ein völlig mathematisches Problem. Verwenden Sie Arctan, die Umkehrfunktion von Tan. Es ist einfach, den Fall durch die Größe von $ x $ und $ \ frac {a ^ 2b} 2 $ zu teilen. Ist arctan ein Universitätsinhalt? Da die Eigenschaft von Arctan hier jedoch überhaupt nicht verwendet wird und die Umkehrfunktion selbst der Inhalt von Mathe III ist, wird angenommen, dass es sich um Mathematik der High School handelt.
import math
a,b,x=[int(s) for s in input().split()]
if x>a*a*b/2:
  h=2*(a*a*b-x)/(a*a)
  print(math.degrees(math.atan(h/a)))
else:
  k=2*x/(a*b)
  print(math.degrees(math.atan(b/k)))

Dies ist ein D-Problem, verwendet jedoch keinen Algorithmus. Dieses Mal werden wir Probleme vorstellen, die leicht gelöst werden können, wenn Sie über solche mathematischen Fähigkeiten verfügen. Selbst Clubmitglieder, die noch keine Programmierkenntnisse haben, sollten dies immer mehr versuchen.

Zielproblem

Verwendete Sprache, Notizen

C Problem

ABC101 C - Minimization

Konzept
Wenn Sie die Problemstellung "$ A_1, A_2, \ dots, A_n $ ist eine Neuanordnung von $ 1, 2, \ dots, N $" nicht übersehen, ist die gesamte Anzahl von Abschnitten mit einer Länge von $ K $ erforderlich. Kannst du es abdecken? Ich stelle fest, dass es ein Problem ist.
Beispielantwort
N,K=[int(s) for s in input().split()]
print((N+K-3)//(K-1))

Die erforderliche Anzahl von Abschnitten ist $ \ left \ lceil \ dfrac {N-1} {K-1} \ right \ rceil $. Hier wird $ \ left \ lceil \ dfrac nm \ right \ rceil = \ left \ lfloor \ dfrac {n + m-1} n \ right \ rfloor $ verwendet und die Deckenfunktion wird nicht aufgerufen. (Ich habe diese Formel auch aus der Erklärung von ABC gelernt.)

ABC105 C - Base -2 Number

Konzept
Es ist eine Entwicklung der $ n $ Basiszahl, die in Mathematik I gelernt wurde, also gibt es keinen Grund zur Sorge. Der Rest nach der Teilung kann der Reihe nach ausgegeben werden.
Beispielantwort
N=int(input())
ls=[]
while True:
  ls.append(N%2)
  N=-(N//2)
  if N==0:
    break
print(*reversed(ls),sep="")

Der schwierigste Teil dieses Problems bestand darin, eine Liste von Zahlen wie [1,1,0,1] in umgekehrter Reihenfolge wie 1011 auszugeben und miteinander zu verbinden. Ich habe Ihnen bereits gesagt, dass Sie Listen einfach mit print verbinden und ausgeben können (* ls, sep = ""). Dann habe ich im Detail verloren, als $ N = 0 $.

ABC108 C - Triangular Relationship

Konzept
Verwenden Sie die Idee des Feldes "Ganzzahl" von Math A. Wenn $ K $ ungerade ist, sind $ a + b, b + c, c + a $ alle Vielfache von $ K $, was bedeutet, dass $ a, b, c $ alle Vielfache von $ K $ sind. Äquivalent. Wenn $ K $ gerade ist, sind "$ a, b, c $ alle Vielfache von $ K $ oder $ a, b, c $ sind alle Vielfache von $ \ frac K2 $ und nicht $ K $" Gleichwertig. Daher sollte in jedem Fall die Anzahl der Vielfachen überprüft, quadriert und addiert werden.
Beispielantwort
N,K=[int(s) for s in input().split()]
if K%2==1:
  print((N//K)**3)
else:
  print((N//K)**3+((N//(K//2)-N//K)**3))

ABC109 C - Skip

Konzept
Geben Sie die maximalen Verpflichtungen von $ x_1-X, x_2-X, \ dots, x_n-X $ aus. Python hat eine Funktion gcd, die das maximale Engagement findet, aber AtCoder verwendet gcd im Bruchmodul anstelle des Mathematikmoduls, da die Python-Version 3.4 ist. Beachten Sie, dass dies möglicherweise einen negativen Wert zurückgibt.
Beispielantwort
import fractions
N,X=[int(s) for s in input().split()]
ls=[int(s)-X for s in input().split()]
a=0
for e in ls:
  a=fractions.gcd(a,e)
print(abs(a))

ABC116 C - Grand Garden

Konzept
Ich wusste auf den ersten Blick nicht, wie es geht, aber ...

Es ist ersichtlich, dass die Summe der Höhenunterschiede (Absolutwerte) zwischen den benachbarten Blüten und dem Boden an beiden Enden doppelt so oft ist wie zum Gießen erforderlich. zu2.png

Einfacher, fügen Sie einfach den grünen Teil hinzu und Sie erhalten die Antwort. Dies sollte ausgegeben werden.

Beispielantwort
N=int(input())
ls=[int(s) for s in input().split()]
ls.append(0)
a=0
for i in range(N):
  a+=max([0,ls[i]-ls[i+1]])
print(a)

ABC117 C - Streamline

Konzept
Wenn überhaupt, die Frage, ob Sie grundlegende Operationen an Arrays ausführen können. Wenn $ X_1
  • Betrachten Sie die Differenzfolge $ Y_n = X_ {n + 1} -X_n $
  • Entferne die oberen $ N-1 $ Stücke von $ Y_1, \ dots, Y_n $
  • Geben Sie die Summe der verbleibenden aus.
  • Ist es Mathe B, da es sich um eine Differenzzahlfolge handelt?

    Beispielantwort
    N,M=[int(s) for s in input().split()]
    if N>=M:
      print(0)
    else:
      ls=[int(s) for s in input().split()]
      ls.sort()
      d=[ls[i+1]-ls[i] for i in range(M-1)]
      d.sort()
      print(sum(d[:M-N]))
    

    Die Antwort ist automatisch 0 für $ N \ ge M $. Das d [: M-N] in der letzten Zeile ist die in der Mitte ausgeschnittene Sequenz d (vor M-N).

    ABC118 C - Monsters Battle Royale

    Konzept
    Geben Sie nur die maximalen Verpflichtungen von $ A_1, A_2, \ dots, A_n $ aus.
    Beispielantwort
    import fractions
    N=int(input())
    ls=[int(s) for s in input().split()]
    a=0
    for e in ls:
      a=fractions.gcd(a,e)
    print(a)
    

    ABC123 C - Five Transportations

    Konzept
    Das langsamste der fünf Verkehrsträger ist der Schlüssel. Das geschwindigkeitsbestimmende Stadium in der Chemie.

    Wenn Sie nach der Zeit fragen, die erforderlich ist, um N Personen mit dem langsamsten Transportmittel zu befördern, ist diese Zeit + 4 Minuten die Antwort.

    Beispielantwort
    import math
    N = int(input())
    A = int(input())
    B = int(input())
    C = int(input())
    D = int(input())
    E = int(input())
    X = min([A,B,C,D,E])
    t=math.ceil(N/X)
    print(t+4)
    

    Oder verwenden Sie $ \ left \ lceil \ dfrac NX \ right \ rceil = \ left \ lfloor \ dfrac {N + X-1} X \ right \ rfloor $

    N = int(input())
    ls = [int(input()) for i in range(5)]
    X = min(ls)
    print((N+X-1)//X+4)
    

    ABC126 C - Dice and Coin

    Konzept
    Mathematik Ein Problem. Keine besonderen Hinweise. Sie können log verwenden, aber Sie können die double for-Schleife drehen, ohne sie zu verwenden.
    Beispielantwort
    import math
    N,K=[int(s) for s in input().split()]
    a=0
    for i in range(N):
      a+=2**(-max([0,math.ceil(math.log2(K/(i+1)))]))
    print(a/N)
    

    Alternativ kann eine Kombination von for- und while-Anweisungen (Doppelschleife) wie folgt geschrieben werden. In meinem Fall gibt es weniger einfache Fehler bei der Verwendung dieser "intelligenten" Methode.

    N,K=[int(s) for s in input().split()]
    a=0
    for i in range(N):
      x=i+1
      n=0
      while x<K:
        n+=1
        x*=2
      a+=2**(-n)
    print(a/N)
    

    ABC129 C - Typical Stairs

    Konzept
    Ein berühmtes Problem in der Mathematik der High School. Diejenigen, die eine schrittweise Formel verwenden. Wenn die Anzahl der Wege zum $ n $ -Stadium $ b_n $ beträgt
    b_{n}=  \begin{cases}
         b_{n-1}+b_{n-2} \quad (n\text{Die Schritte sind nicht gebrochen})\\
         0\qquad (n\text{Die Schritte sind gebrochen})
      \end{cases}
    

    Hält für $ n \ ge2 $. Die Methode zur Implementierung dieser Wiederholung ist für Anfänger eigentlich schwierig, daher habe ich mich gefragt, ob ich mich in diesem Artikel damit befassen soll, aber ich habe mich damit befasst, weil es sich um zu hohe Mathematik handelt.

    Beispielantwort
    Ich habe das verwendet, was als "Wiederholung der Memoisierung" bezeichnet wird.
    MOD=10**9+7
    N,M=[int(s) for s in input().split()]
    ls=[1 for _ in range(N+1)]
    for i in range(M):
      ls[int(input())]=0
    for n in range(2,N+1):
      if ls[n]!=0:
        ls[n]=(ls[n-1]+ls[n-2])%MOD
    print(ls[N])
    

    ABC130 C - Rectangle Cutting

    Konzept
    Ich habe nichts zu sagen. Es kann immer in zwei gleiche Teile geteilt werden, und wenn der Punkt $ (x, y) $ der Schnittpunkt der diagonalen Linien des Rechtecks ist, kann er auf mehrere Arten geschnitten werden. In einigen Fällen sollte es in der Klasse "Liniensymmetrie, Punktsymmetrie" der Junior High School behandelt werden.
    Beispielantwort
    W,H,x,y = [int(s) for s in input().split()]
    if 2*x==W and 2*y==H :
      print(W*H/2,1)
    else:
      print(W*H/2,0)
    
    

    ABC131 C - Anti-Division

    Konzept
    Vollständig Mathematik an der High School. Das Feld "Menge und Logik" der Mathematik A. "Gesamtzahl" - "Anzahl der Vielfachen von $ C $" - "Anzahl der Vielfachen von $ D $" + "Anzahl der gemeinsamen Vielfachen von $ C und D $" kann ausgegeben werden.

    Die Anzahl der Vielfachen von $ x $, die größer oder gleich $ A $ und kleiner oder gleich $ B $ ist, ist "die Anzahl der Vielfachen von $ x $, die kleiner als $ B $ ist" - "das Vielfache von $ x $, das kleiner als $ A-1 $ ist". Es wird durch "Zahl" berechnet.

    Übrigens hat das Fraktionsmodul keine Funktion lcm, um das minimale gemeinsame Vielfache zu finden. Daher habe ich versucht, das minimale gemeinsame Vielfache mit $ C \ times D \ div gcd (C, D) $ zu finden. Dies ist der Inhalt des Feldes "Ganzzahl" von Math A.

    Beispielantwort
    import fractions
    A,B,C,D = [int(s) for s in input().split()]
    L=C*D//fractions.gcd(C,D)
    print(B-(A-1)
          -(B//C)+((A-1)//C)
          -(B//D)+((A-1)//D)
          +(B//L)-((A-1)//L))
    

    Es gibt auch ein einfacheres C-Problem

    Die vorherigen sind die Schwierigkeiten, die unter Bei Codiererproblemen angezeigt werden, dh die Probleme mit der mittleren Rate der richtigen Antwortenden von 400 (braun) oder mehr und tatsächlich mehr. Es gibt viele Dinge, die leicht gelöst werden können (entspricht Grau).

    Am Ende lernen Sie den Algorithmus

    D Problem und höher

    Jenseits des D-Problems wird das Problem "dieses Teils der Mathematik der High School!" Abnehmen.

    Selbst wenn es durch die Kraft der Mathematik vereinfacht wird, erfordert die Implementierung häufig noch Kenntnisse über Algorithmen (die in der Grenze der Ausführungszeit gefangen sind), so dass zu Beginn "einfache" Probleme wie 144D und 139D eingeführt wurden. Die Realität ist, dass es nur wenige gibt.

    Es macht Spaß, Algorithmen zu studieren

    Lassen Sie uns also den Algorithmus untersuchen.

    Es macht Spaß, die Erklärungen unlösbarer Probleme mit sehr anschaulichen Lösungen und interessanten Algorithmen zu sehen (obwohl ich gleich nach dem Lesen deprimiert bin). Wenn Sie dies genießen können, können Sie den Wettbewerb Pro genießen.

    Recommended Posts

    Zusammenfassung der AtCoder C-Probleme, die in der Mathematik der High School gelöst werden können
    [High School Mathematik + Python] Logistikproblem
    Zusammenfassung der Standardeingabe von Python, die in Competition Pro verwendet werden kann
    Atcoder-Anfängerwettbewerb A, B Zusammenfassung der Eingabe, die tendenziell ein Problem für Python darstellt
    Funktionen, die in der for-Anweisung verwendet werden können
    Erstellen von Sphinx, das mit Markdown geschrieben werden kann
    Zusammenfassung der statistischen Datenanalysemethoden mit Python, die im Geschäftsleben verwendet werden können
    Grundlegende Algorithmen, die bei Wettkampfprofis eingesetzt werden können
    Hinweise zu Python-Kenntnissen, die mit AtCoder verwendet werden können
    ANTs Bildregistrierung, die in 5 Minuten verwendet werden kann
    Nichtlineare simultane Gleichungen können mit Python leicht gelöst werden.
    [Atcoder] [C ++] Ich habe ein Testautomatisierungstool erstellt, das während des Wettbewerbs verwendet werden kann
    Formatübersicht der Formate, die mit gensim serialisiert werden können
    Neuronales Netzwerk zum Verstehen und Implementieren in der Mathematik der High School
    Goroutine (parallele Steuerung), die im Feld eingesetzt werden kann
    Textanalyse, die in 5 Minuten durchgeführt werden kann [Word Cloud]
    Goroutine, die im Feld verwendet werden kann (errgroup.Group Edition)
    AtCoder ABC151 Problem D Geschwindigkeitsvergleich in C ++ / Python / PyPy
    Skripte, die bei der Verwendung von Bottle in Python verwendet werden können
    SIR-Modell, das auch Schüler der Mittelstufe verstehen können
    Bewertungsindex, der für GridSearchCV von sklearn angegeben werden kann
    AtCoder Beginner Contest # 002 C Problem
    AtCoder Regular Contest # 002 C Problem
    Erstellen Sie eine Spinbox, die mit Tkinter in Binär angezeigt werden kann
    Ein Timer (Ticker), der im Feld verwendet werden kann (kann überall verwendet werden)
    Umgang mit Zeichenketten in der JSON-Kommunikation
    Erstellen Sie eine Spinbox, die mit Tkinter in HEX angezeigt werden kann