[PYTHON] So lösen Sie die rekursive Funktion, die abc115-D gelöst hat

Problem

https://atcoder.jp/contests/abc115/tasks/abc115_d

Die zweite Herausforderung. Ich war wirklich glücklich, es zu lösen. Diese Art von Problem ist überraschend wichtig, da es auch auf anderen professionellen Websites von Wettbewerbern gestellt wird.

Richtung

Es ist nicht schwer vorstellbar, dass eine rekursive Funktion aus der Problemstellung verwendet wird. Das Problem ist, dass wenn Sie einen Simulator erstellen, alle Burgerelemente riesig sind, so dass es unmöglich ist. Überlegen Sie, was Sie brauchen, und lösen Sie es effizient mit Arithmetik.

Was ist schwierig

Es gibt kein Problem bei der Interpretation des Problems. Die Frage ist, ob die Bedingungen und der Rückgabewert für die Wiederholung korrekt bestimmt werden können. Darüber hinaus erhöht die Tatsache, dass es viele bedingte Zweige gibt, auch den Schwierigkeitsgrad.

Lösung

Ich hatte das Gefühl, dass der Trick des rekursiven Problems darin bestand, die Zustandsphase mit einer kleinen Anzahl von Werten zu modellieren. Mit anderen Worten, die folgenden zwei Dinge sind wichtig

  1. Da die Funktion rekursiv aufgerufen wird, erstellen Sie eine Funktion, die für alle N, N-1, N-2 ... 1, 2 gilt.

  2. Beachten Sie die Kündigungsbedingungen.

  3. Da die Funktion rekursiv aufgerufen wird, erstellen Sie eine Funktion, die für alle N, N-1, N-2 ... 1, 2 gilt.

Da bei diesem Problem der aktuelle Standort von Daxfund und die Dimension des Burgers benötigt werden, nehmen wir diese beiden als Argumente.

  1. Beachten Sie die Kündigungsbedingungen.

Dieses Mal gibt es eine leicht verständliche Endbedingung für Burger der Stufe 0, verwenden Sie diese also.

Code

Der Code unten. Es gibt Raum für Verbesserungen, da meine Lösung drei Argumente vergeblich verwendet.

N, X = map(int, input().split())
patty = [1]
buns = [0]

for i in range(0, N):
    patty.append(patty[i] * 2 + 1)
    buns.append(buns[i] * 2 + 2)

print(patty)
print(buns)

burger_high = patty[N] + buns[N]
print("burger : ", burger_high)
print("burger/2 : ", burger_high/2)


def dfs(now_runrun, now_burger_high, dimension):
    if dimension == 0:
        return 1
    ##Wenn Runrun unten ist, können Sie keine Pastetchen essen
    elif now_runrun == 1:
        return 0

    ##Wenn Runrun in der Mitte ist, n-1D Burger+Essen Sie 1
    elif now_runrun == now_burger_high // 2 + 1:
        return patty[dimension - 1] + 1

    ##Iss alle Pastetchen, wenn Runrun oben ist
    elif now_runrun == now_burger_high:
        return patty[dimension]


    next_burger = now_burger_high // 2 - 1
    next_dimension = dimension - 1

    if now_runrun <= now_burger_high // 2:
        return dfs(now_runrun - 1, next_burger, next_dimension)
    else:
        return dfs(now_runrun - (patty[next_dimension] + buns[next_dimension] + 2),
                   next_burger, next_dimension) + patty[next_dimension] + 1


print(dfs(X, burger_high, N))

Recommended Posts

So lösen Sie die rekursive Funktion, die abc115-D gelöst hat
So erstellen Sie eine rekursive Funktion
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
Rekursive Funktion, die die XML-Baumstruktur anzeigt [Hinweis]
[Einführung in Python] Wie iteriere ich mit der Bereichsfunktion?
Wie man das Dokument der magischen Funktion (Linienmagie) trifft
Verwendung des Generators
So rufen Sie eine Funktion auf
Wie benutzt man den Dekorateur?
So erhöhen Sie die Achse
So starten Sie die erste Projektion
Berechnen des aus ABC134-D gelernten Rechenaufwands
So führen Sie die Exportfunktion des GCP-Datenspeichers automatisch aus
[Einführung in Python] So erhalten Sie Daten mit der Funktion listdir
So lösen Sie das Problem, dass Videoinhalte unter Firefox für Linux nicht abgespielt werden können
Wie berechnet man den Autokorrelationskoeffizienten?
Verwendung des optparse-Moduls
So lösen Sie das Problem, dass APL nach der Übertragung auf das eigentliche Gerät unter Kivy-iOS nicht gestartet wird
[Python] Wie man nCk ableitet (ABC156-D)
[Python 3.8 ~] Wie man rekursive Funktionen mit Lambda-Ausdrücken intelligent definiert
So lösen Sie simultane lineare Gleichungen
17. Offline-Echtzeit So lösen Sie Schreibprobleme mit Python
So stellen Sie fest, dass in Python3 ein Kreuzschlüssel eingegeben wurde
Lesen des SNLI-Datensatzes
So erhalten Sie die Python-Version
[Python] Erklärt anhand eines Beispiels, wie die Formatierungsfunktion verwendet wird
So überschreiben Sie die Ausgabe auf die Konsole
Verwendung der Zip-Funktion von Python
Verwendung des ConfigParser-Moduls
Verwendung der in .mako (.html) direkt in mako definierten Renderfunktion
So lösen Sie das Problem, dass die Zeit jedes Mal schief geht, wenn Sie die Stromversorgung unter Linux einschalten
Lösen von Folienrätseln und 15 Rätseln
Versuchen Sie, das Problem der Funktionsminimierung mithilfe der Partikelgruppenoptimierung zu lösen
Wie man mit dem Problem umgeht, dass die Erstellung fehlschlägt, wenn CI / CD von Python Function mit AWS Amplify
Das 16. Offline-Echtzeit-Schreibproblem wurde mit Python gelöst
Teilen und Verarbeiten eines Datenrahmens mithilfe der Groupby-Funktion
Das 16. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Verwendung der Bibliothek "torchdiffeq", die den ODE-Block von Neural ODE implementiert
[Python] Verwendung der Aufzählungsfunktion (Indexnummer und Element extrahieren)
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
Das 19. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Das 15. Offline-Problem beim Schreiben in Echtzeit wurde mit Python gelöst
[C-Sprache] Verwendung der Krypta-Funktion unter Linux [Passwort-Hashing]
So zeigen Sie den Fortschrittsbalken an (tqdm)
Verwendung der Spark ML-Pipeline
So überprüfen Sie die Version von Django
So crawlen Sie Seiten, die unendlich scrollen
So stellen Sie die Serverzeit auf japanische Zeit ein
So aktualisieren Sie den AMP-Cache manuell
[Python] Verwendung von __command__, Funktionserklärung
[Linux] Verwendung des Befehls echo
So erhalten Sie eine farbige Ausgabe an die Konsole
So bedienen Sie Linux von der Konsole aus
[Python] Verstehen, wie rekursive Funktionen verwendet werden
So greifen Sie von außen auf den Datenspeicher zu
Verwendung des IPython-Debuggers (ipdb)
So lösen Sie das Problem, dass nur der Prozess übrig bleibt, wenn Sie auf dem Imshow-Bildschirm von OpenCV auf Kreuz drücken
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
So ermitteln Sie den Koeffizienten der ungefähren Kurve, die in Python durch die Scheitelpunkte verläuft