[PYTHON] [Bei Coder] Lösen Sie das Problem der Dichotomie

Ich möchte ein wettbewerbsfähiger Profi sein, also [Diese Seite (AtCoder-Version! Arimoto (Anfänger))](https://qiita.com/drken/items/e77685614f3c6bf86f44#%E4%BE%8B%E9%A1%8C-2 -5-5warshall-floyd-% E3% 82% 92% E4% BD% BF% E3% 81% 86% E5% 95% 8F% E9% A1% 8C) zur Lösung des AtCoder-Problems und Das Fundament ist verfestigt. Diesmal habe ich [dieses Problem] gelöst (https://www.ioi-jp.org/joi/2007/2008-ho-prob_and_sol/2008-ho.pdf#page=6) (C-Darts in ) ist. Es ist eine Dichotomie (Berechnungsbetrag O (logN)), die die Grundlage für konkurrierende Profis bildet, aber es ist ziemlich schwierig zu entscheiden, wo sie verwendet werden soll. ..

Problemzusammenfassung

Wirf vier Pfeile, um das Maximum der in $ P_1, P_2, ..., P_N $ getroffenen Gesamtpunkte zu ermitteln, die $ M $ nicht überschreiten. Sie können auch festlegen, dass der Pfeil nicht geworfen wird. S \leq M 1 \leq N \leq 1000 1 \leq M \leq 2 \times 10^8

Lösung

Das erste, was mir in den Sinn kommt, ist, alle Muster auf $ (N + 1) ^ 4 $ Weise zu betrachten ("+1" ist die Hinzufügung des Pfeils P = 0 für "nicht werfen". ). Mit anderen Worten, es ist eine vollständige Suche. Es kann einfach durch Schreiben einer Vierfachschleife implementiert werden. In diesem Fall wird der Berechnungsbetrag jedoch zu $ O (N ^ 4) $, und AC kann nur durchgeführt werden, wenn $ N = 100 bis 200 $.

Wenn Sie es also entwickeln und ** Dichotomie ** verwenden, können Sie es in $ O (N ^ 2logN) $ Zeit lösen. Dies ist die in der Erläuterung beschriebene Methode der Lösung 3. Anstatt "den Pfeil viermal zu werfen", denken Sie an "zweimal werfen und zweimal machen". Wenn Sie den Pfeil zweimal werfen, erhalten Sie weniger als $ (N + 1) ^ 2 $. Sortieren wir dieses Ergebnis zuerst nach $ Q_1, Q_2, ...., Q_r $. Der Berechnungsbetrag beträgt $ O (N ^ 2logN) $. → Mit anderen Worten, es kann umformuliert werden als "wenn die Punktzahl r ist, ist die Summe, wenn der Pfeil zweimal geworfen wird, M oder weniger". Unter der Annahme, dass die Summe der ersten beiden Pfeile $ Q_i $ ist, ist die optimale Lösung für die Summe der verbleibenden zwei Pfeile $ (Q_j) $ Q_i + Q_j \leq M Von den $ j $, die befriedigen, kann derjenige mit dem größten $ Q_j $ gefunden werden. Ein solches $ j $ kann in $ O (N ^ 2logN) $ Zeit durch eine Dichotomie gefunden werden. Einschließlich der Vorbereitungszeit kann sie in $ O (N ^ 2logN) $ Zeit als Ganzes berechnet werden.

Unten finden Sie ein Beispiel für eine Antwort mit Python. Die Bibliothekshalbierung erleichtert die Dichotomie.

import bisect

N, M = map(int, input().split())
p_list = [int(input()) for _ in range(N)]
p_list.append(0)
p_list.sort()
q_list = []

#Erstellen Sie eine Liste von Qi
for i in range(N+1):
    for j in range(i, N+1):  #Ich versuche, Doppelarbeit zu vermeiden ... ★
        q = p_list[i] + p_list[j]
        if q <= M:
            q_list.append(q)
q_list.sort()

ans = 0
for q1 in q_list:
    #Halbierungssuche(Es muss richtig sein, weil es korrekt berechnet wird, wenn die Summe M) ist.
    insert_index = bisect.bisect_right(q_list, M-q1)
    tmp_ans = q1 + q_list[insert_index-1]
    ans = max(ans, tmp_ans)

print(ans)

Übrigens, der ★ Teil im Code,

for i in range(N+1):
    for j in range(N+1): 
        q = p_list[i] + p_list[j]
        if q <= M:
            q_list.append(q)

Als ich es als berechnete und später versuchte, es zu sortieren, war es MLE. Gedächtnis ist wichtig.

Recommended Posts

[Bei Coder] Lösen Sie das Problem der Dichotomie
[At Coder] Lösen Sie typische Probleme der Tiefenprioritätssuche (DFS).
Lösen Sie die Verzögerung der Interferometerbeobachtung
Illustration der Ergebnisse des Rucksackproblems
Lösen Sie das Problem der fehlenden libcudart in Ubuntu 16.04 + CUDA 8.0 + Tensorflow-Umgebung
Versuchen Sie, das N Queen-Problem mit SA von PyQUBO zu lösen
Lösung des Anfangswertproblems gewöhnlicher Differentialgleichungen mit JModelica
Lösen Sie Teilsummenprobleme mit der vollständigen Suche in Python
Verwenden Sie Rasppie, um das Problem einer unzureichenden mobilen Wi-Fi-Verbindung zu lösen
So lösen Sie das Problem beim Verpacken des Behälters
Ruf Hallo, Reiwa! Am Anfang von Reiwa!
Bei Coder (2020/09/08)
Lösen Sie das Problem des Handlungsreisenden mit OR-Tools
Lösen Sie das maximale Subarray-Problem in Python
Auf der Suche nach dem schnellsten FizzBuzz in Python
Python-Grundkurs (Ende 15)
Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
[AtCoder] Lösen Sie ein Problem von ABC101 ~ 169 mit Python
[Python] ABC133B (Problem mit dem oberen rechten Dreieck) [At Coder]
Bestätigung grundlegender Angelegenheiten des Wettbewerbsprofis ~ Dichotomisierte Suche ~
Versuchen Sie, das Problem der Python-Klassenvererbung zu lösen
Lösen Sie Rucksackprobleme mit pyomo und glpk
Ich habe das tiefste Problem von Hiroshi Yuki gelöst.
Löse A ~ D des Yuki-Codierers 247 mit Python
Senden Sie Google Mail am Ende des Vorgangs [Python]
Suchen Sie nach dem Wert der Instanz in der Liste
Zum Zeitpunkt des Python-Updates mit Ubuntu
Entfernen Sie eine bestimmte Zeichenfolge am Ende von Python
ABC146C (Dichotomie)
Ich habe die Berechnungszeit von "X in Liste" (lineare Suche / dichotome Suche) und "X in Menge" untersucht.
Füllen Sie bei Coder
Bei Coder # 1 um Mitternacht
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
[Python] AGC043A (Problemlesefähigkeit und DP) [At Coder]
[GoLang] Setzen Sie am Anfang des Kommentars ein Leerzeichen
Auf der Suche nach dem besten zufälligen Punktstereogramm (RDS).
Versuchen Sie, die Probleme des "Matrix-Programmierers" zu lösen (Kapitel 1).
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen
Holen Sie sich das Bild von "Suzu Hirose" von Google Bildersuche.
Schauen Sie sich die Go-Punktzahl eines professionellen Go-Spielers an
[Bei Coder] Lösen eines typischen BFS-Problems [A - Dunkler und Dunkler]
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Aufgaben zu Beginn eines neuen Python-Projekts
Zip 4 Gbyte Problem ist eine Geschichte der Vergangenheit
Ein 2-minütiger Suchbaum ist ein Verwandter der Hash-Kette !?
Animieren Sie die Grundlagen der dynamischen Planung und Rucksackprobleme
Ich habe versucht, das Problem von F02 zu lösen, wie man mit Python offline in Echtzeit schreibt