[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 5/22]

** Streben Sie einen hellblauen Codierer an! !! !! !! !! !! ** ** **

Damit [Richtlinien zur Verbesserung von AtCoder, einem von Red Coder gelehrten Wettbewerbsprofi [Zwischenausgabe: Ziel für hellblauen Coder! ]]( https://qiita.com/e869120/items/eb50fdaece12be418faa#2-3-%E5%88%86%E9%87%8E%E5%88%A5%E5%88%9D%E4%B8%AD%E7 % B4% 9A% E8% 80% 85% E3% 81% 8C% E8% A7% A3% E3% 81% 8F% E3% 81% B9% E3% 81% 8D% E9% 81% 8E% E5% 8E % BB% E5% 95% 8F% E7% B2% BE% E9% 81% B8-100-% E5% 95% 8F) (@ e869120)

AtCoder hat 100 gute pädagogische Fragen gesammelt, die für braune und grüne Codierer geeignet sind, um mit einer kleinen Anzahl von Fragen einen hellblauen Codierer oder eine Bewertung von 1200 zu erzielen.

"100 frühere Fragen, die Anfänger und Fortgeschrittene in diesem Artikel lösen sollten" Wird mit ** Python ** gelöst! Vielen Dank an @ e869120! !! !! !! !! !!

Link zum letzten Artikel

** Alle durchsuchen: Alle auflisten ** [Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 1/22] ** Vollständige Suche: Alle Aufzählungen zur Reduzierung der Anzahl der Straßen durch Ausarbeitung ** [Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Part2 / 22] ** Vollständige Suche: Bit vollständige Suche ** [[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil3 / 22]] (https://qiita.com/rudorufu1981/items/74d5f37c26c62fc7a27f) ** Vollständige Suche: Vollständige Suche weiterleiten ** [Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Part4 / 22] ** Halbierungssuche ** [Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Part5 / 22] ** Suche nach Tiefenpriorität ** [Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Part6 / 22] ** Suche nach Breitenpriorität ** [Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Part7 / 22]

** (Hinzugefügt am 2020/05/07) **

"Teil 5" -Dichotomie-

Wir werden die folgenden 6 Fragen lösen!

Halbierungssuche

18 ALDS_4_B - Dichotomie Dies ist ein Grundproblem. Sie können es auch mit einer Karte lösen, aber versuchen Sie es mit einer Dichotomie. 19 JOI 2009 Finale 2 - Pizza 20 AtCoder Anfängerwettbewerb 077 C --Snuke Festival Es ist interessant. 21 AtCoder Anfängerwettbewerb 023 D - Shooting King Pädagogisch gut. 22 AtCoder Regular Contest 054 B - Moores Gesetz Es kann durch Differenzieren und Dichotomisieren gelöst werden. Da die Geschichte mit der dreiminütigen Suche verbunden ist, halte ich es auch für gut, dies zu überprüfen. 23 JOI 2008 Final 3 --Darts Dies ist ein Herausforderungsproblem, das Sie in zwei Hälften entwickeln und suchen können.

Voraussetzung Kenntnisse der Dichotomie

・ Ich werde einen Artikel schreiben, der auf den folgenden zwei Punkten basiert! ** ① Über Dichotomie ** Zunächst Kenchos Artikel Verallgemeinerung des Dichotomiealgorithmus - Empfehlung der Dichotomiemethode Lesen Sie mehr über die Dichotomie ** Verstehen Sie die Atmosphäre! ** ** **

** ② Danach, wie man die Python-Dichotomie implementiert ** Wie Die folgende Seite war leicht zu verstehen, also diese Seite AtCoder Must-See für graue, braune und grüne Leute! Wie schreibe ich eine Dichotomie, ohne sie fehlerhaft zu machen? ** Vorsichtig ** Lies über die Dichotomie ** Verstehe tief! ** ** **

18 ALDS_4_B - Dichotomie

Wenn Sie die Länge des Produktsatzes jedes Satzes (Satzes) nehmen, ist dies ein Schuss. Ich werde mein Bestes tun, um dies durch Dichotomisierung umzusetzen. Es war mein erstes Mal, dass ich eine Dichotomie implementierte. Als ich es gemäß der obigen Seite implementiert habe ** Es war unerwartet einfach zu implementieren! ** ** **

test.py


def I(): return int(input())
def LI(): return list(map(int,input().split()))
n = I()
S = LI()
q = I()
T = LI()
ans = 0
def birarysearch(x):
    ok,ng = -1,n
    def is_ok(i):
        return S[i]<=x
    while abs(ok-ng)>1:
        mid = (ok+ng)//2
        if is_ok(mid):
            ok = mid
        else:
            ng = mid
    return S[max(ok,0)]==x
for x in T:
    if birarysearch(x):
        ans += 1
print(ans)

Das Maximum des ok Index ist die Antwort! Seien Sie jedoch vorsichtig, wenn der Index negativ wird, und setzen Sie ihn auf "max (ok, 0)"!


Eine andere Lösung
Wenn Sie die Bibliothek "bisect" verwenden können, verwenden wir sie! ** Wahnsinnig einfach zu implementieren! !! !! ** ** **

** Mit dem ok Index im obigen Code, Der Index von bisect.bisect (S, x) -1 im folgenden Code ist der gleiche! ** ** **

test.py


import bisect
def I(): return int(input())
def LI(): return list(map(int,input().split()))
n = I()
S = LI()
q = I()
T = LI()
ans = 0
for x in T:
    ok = bisect.bisect(S,x)-1
    if S[max(ok,0)]==x:
        ans += 1
print(ans)

Sowieso

** Diese beiden Indizes sind Eisenplatten in der Dichotomie! !! !! ** ** **

19 JOI 2009 Finals 2-Pizza

Dies war auch ** unerwartet einfach zu implementieren! ** ** ** Sie können die Pizza aus dem Index "OK" oder dem Index rechts davon liefern, je nachdem, welcher Wert näher liegt.

test.py


def I(): return int(input())
d = I()
n = I()
m = I()
dn = [0]+sorted([I() for _ in range(n-1)])+[d]
mn = sorted([I() for _ in range(m)])
ans = 0
def binarysearch(x):
    ok,ng = -1,len(dn)
    def is_ok(i):
        return dn[i]<=x
    while abs(ok-ng)>1:
        mid = (ok+ng)//2
        if is_ok(mid):
            ok = mid
        else:
            ng = mid
    return min(x-dn[ok],dn[ok+1]-x)
for x in mn:
    ans += binarysearch(x)
print(ans)


Eine andere Lösung
Wenn Sie die Bibliothek bisect verwenden können, verwenden wir sie auch! ** Einfach zu implementieren! !! !! ** ** **

test.py


import bisect
def I(): return int(input())
d = I()
n = I()
m = I()
dn = [0]+sorted([I() for _ in range(n-1)])+[d]
mn = sorted([I() for _ in range(m)])
ans = 0
for x in mn:
    ok = bisect.bisect(dn,x)-1
    ans += min(x-dn[ok],dn[ok+1]-x)
print(ans)

20 AtCoder Beginner Contest 077 C - Snuke Festival Difficulty:1096 ** Ich konnte es auf den ersten Blick nicht lösen! !! !! ** ** **

bisect.bisect_left erscheint ... Es gab keine Ahnung ** basierend auf ** B, nicht A oder C ... Wie Sie der Erklärung entnehmen können, wurde das Problem ...! **Ich habe viel gelernt! !! !! ** ** **

test.py


import bisect
def I(): return int(input())
def LI(): return list(map(int,input().split()))
N = I()
A = sorted(LI())
B = sorted(LI())
C = sorted(LI())
ans = 0
for b in B:
    ok_a = bisect.bisect_left(A,b)
    ok_c = bisect.bisect_right(C,b)
    ans += ok_a*(N-ok_c)
print(ans)

21 AtCoder-Anfängerwettbewerb 023 D - Shooting King

** Schwierigkeit: 1804! !! !! Blaues Problem! !! !! Ich konnte das auf den ersten Blick nicht lösen! !! !! ** ** **

Schauen Sie sich den Code derer an, die Kommentare abgeben können. Aber können Sie es lösen, wenn ein ähnliches Problem erneut auftritt? Wenn Sie das sagen, weiß ich immer noch nicht, welches Bild gelöst werden kann ... ** Unzureichende Übung für überwiegend schwierige Probleme! !! !! ** ** **

test.py


import numpy as np
def I(): return int(input())
def LI(): return list(map(int,input().split()))
N = I()
HS = np.array([LI() for _ in range(N)])
H = HS[:,0]
S = HS[:,1]
rangeN = np.arange(N)
ok,ng = 10**9+10**9*10**9+1,0
def is_ok(i):
    T = (i-H)//S
    T.sort()
    return (T>=rangeN).all()
while abs(ok-ng)>1:
    mid = (ok+ng)//2
    if is_ok(mid):
        ok = mid
    else:
        ng = mid
print(ok)

22 AtCoder Regular Contest 054 B - Moores Gesetz

Difficulty:1268 ** Ich konnte das auf den ersten Blick nicht lösen! !! !! ** ** **

Es ist keine Dichotomie ** Es scheint, dass es durch die Dreiteilung gelöst werden kann **! Es ist keine monotone Zunahme oder monotone Abnahme, also scheint es, dass Sie keine Dichotomie machen können! Ich habe es implementiert, während ich verschieden gegoogelt habe, aber ich kann nur die Atmosphäre w erfassen

Ich bin auf dieses Problem gestoßen, als ich die erste Formel formulierte ... ** Dies sollte wahrscheinlich mit viel Übung bei schwierigen Problemen möglich sein! !! !! ** ** ** Wenn Sie konkret darüber nachdenken, 0 Jahre, 1 Jahr, 2 Jahre ..., können Sie eine Formel erstellen!

test.py


def F(): return float(input())
P = F()
high,low = P,0
def f(x):
    return x+P*2**(-x/1.5)
def is_high(i,j):
    return f(i)>=f(j)
while high-low>1*(10**-12):
    mid_right = (high*2+low)/3
    mid_left = (high+low*2)/3
    if is_high(mid_right,mid_left):
        high = mid_right
    else:
        low = mid_left
print(f(high))


Eine andere Lösung
Ich fühle mich ein wenig böse, aber kein w Die Antwort kann erhalten werden, indem der Wert von x durch 1. Differenzierung = 0 in "x + P * 2 ** (-x / 1,5)" eingesetzt wird. Der Wert von x des 1. Differentials = 0 ist [Diese Seite] (https://ja.wolframalpha.com/input/?i=%28x%2BP*%282**%28-x%2F1.5%29%29%29%27%3D+0) Lass uns benutzen!

als Ergebnis, x≈-2.16404 log(2.16404/P) Weil es herauskommt Danach setzen Sie einfach x in x + P * 2 ** (-x / 1.5)!

test.py


import math
def F(): return float(input())
P = F()
x = -2.16404*math.log(2.16404/P)
def f(x):
    return x+P*(2**(-x/1.5))
print(f(x) if x>0 else f(0))

** Ich habe AC gemacht! ** ** ** Apropos Als Voraussetzung ist "x> = 0" (ich kann nicht in die Vergangenheit zurückkehren!), Also werde ich die letzten Fälle trennen. Sie werden die Notwendigkeit einer Fallklassifizierung beim Debuggen von Eingabe / Ausgabe-Beispiel 2 bemerken!

23 JOI 2008 Final 3 --Darts

** Natürlich konnte ich es nicht auf den ersten Blick lösen! !! !! ** ** ** Oder besser gesagt, ich habe keine Ahnung, wo ich die Dichotomie verwenden soll. Natürlich ist es nicht möglich, ein "Vierfach für einen Satz" oder eine Vollbit-Suche durchzuführen. Denken Sie also in zwei oder zwei darüber nach! Wenn "N <= 1000", kann der Berechnungsbetrag "10 ^ 6" auf "doppelt für Aussage" erhöht werden, also frage ich mich, ob diese Zahl "1000" ein Hinweis war ...

Dieser Beitrag AtCoder-Version! Arimoto (Anfänger) Lösen von Pfeilen mit Python Ich konnte es mit Bezug auf ** sicher umsetzen! ** ** **

test.py


import bisect,itertools
def I(): return int(input())
def LI(): return list(map(int,input().split()))
N,M = LI()
P = [I() for _ in range(N)]
ans = 0
set_two_darts = set()
for x,y in itertools.product(P+[0],repeat=2):
    set_two_darts.add(x+y)
list_two_darts = sorted(set_two_darts)
ok_two_darts = bisect.bisect(list_two_darts,M)-1
if list_two_darts[ok_two_darts]<=M:
    ans = max(ans,list_two_darts[ok_two_darts])
for z in list_two_darts:
    remaining_point = M-z
    if remaining_point<=0:
        continue
    ok = bisect.bisect(list_two_darts,remaining_point)-1
    ans = max(ans,z+list_two_darts[ok])
print(ans)

Nächstes Mal werde ich die folgenden 4 Fragen lösen!

Tiefenprioritätssuche

24 ALDS_11_B - Tiefe Prioritätssuche Dies ist ein Grundproblem. 25 AOJ 1160-Wie viele Inseln gibt es? Die Anzahl der verbundenen Komponenten im Diagramm kann durch Suche nach Tiefenpriorität berechnet werden. 26 AtCoder-Anfängerwettbewerb 138 D - Ki Viele Baumstrukturprobleme verwenden die Suche nach Tiefenprioritäten. 27 JOI 2009 Qualifizieren der 4-dünnen Eisüberquerung Die Suche nach Tiefenprioritäten ist nicht nur eine Baumstruktur, sondern ein Problem, das uns sagt. Es kann mit einer rekursiven Funktion gelöst werden.

Part5/22 Ende!

Weiter (Teil 6/22)

Recommended Posts

[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 5/22]
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 7/22]
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 4/22]
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 3/22].
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 1/22]
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 6/22]
Lösen Sie mit Python [100 frühere Fragen, die Anfänger und Fortgeschrittene lösen sollten] (028 - 033 Suche nach Breitenpriorität)
Lösen mit Python [100 frühere Fragen, die Anfänger und Fortgeschrittene lösen sollten] (053 --055 Dynamische Planungsmethode: Andere)
Lösen Sie mit Python [100 frühere Fragen, die Anfänger und Fortgeschrittene lösen sollten] (024 --027 Suche nach Tiefenprioritäten)
Lösen Sie mit Python [100 ausgewählte Fragen aus der Vergangenheit, die Anfänger und Fortgeschrittene lösen sollten] (015 --017 Vollständige Suche: Vollständige Suche weiterleiten)
Löse mit Python [100 ausgewählte Fragen aus der Vergangenheit, die Anfänger und Fortgeschrittene lösen sollten] (010 --014 Vollständige Suche: Bit vollständige Suche)
Lösen Sie mit Python [100 ausgewählte Fragen aus der Vergangenheit, die Anfänger und Fortgeschrittene lösen sollten] (001 - 004 Alle suchen: Alle Aufzählungen)
Lösen Sie mit Python [100 frühere Fragen, die Anfänger und Fortgeschrittene lösen sollten] (056 - 059 Problem mit der kürzesten Route: Dyxtra-Methode)
Lösen Sie mit Python [100 frühere Fragen, die Anfänger und Fortgeschrittene lösen sollten] (034-038 Dynamische Planungsmethode: Knapsack DP basic)
Lösen Sie mit Python [100 frühere Fragen, die Anfänger und Fortgeschrittene lösen sollten] (039 - 045 Dynamische Planungsmethode: Knapsack DP-Variante)
Lösen Sie mit Python [100 ausgewählte Fragen aus der Vergangenheit, die Anfänger und Fortgeschrittene lösen sollten] (005 --- 009 Alle Suche: Alle Aufzählungen, um die Anzahl der Straßen durch Entwickeln zu reduzieren)
[Für Anfänger von Wettkampfprofis] Ich habe versucht, 40 AOJ "ITP I" -Fragen mit Python zu lösen
Python, das ich Anfängern in der Programmierung empfehlen möchte
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Django super Einführung von Python-Anfängern! Teil 6 Ich habe versucht, die Login-Funktion zu implementieren
Ich habe versucht, die Sprachen, die Anfänger von nun an lernen sollten, absichtlich zusammenzufassen
Tohoku University 2020 Early Mathematical Exam (Science) Ich habe versucht, die großen Fragen 1 bis 3 mit Python zu lösen
Django super Einführung von Python-Anfängern! Teil 1 Ich habe versucht, eine HTML-Seite anzuzeigen, auf der nur "Hallo Welt" steht.
Ich habe versucht, Python zu berühren (Installation)
Python-Anfänger versuchten es herauszufinden
Ich möchte APG4b mit Python lösen (nur 4.01 und 4.04 in Kapitel 4)
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
[Pandas] Ich habe versucht, Verkaufsdaten mit Python zu analysieren. [Für Anfänger]
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen
[Python] Ich habe versucht, Wörter, die für Anfänger schwer zu verstehen sind, auf leicht verständliche Weise zu erklären.
Ich habe versucht, die Behandlung von Python-Ausnahmen zusammenzufassen
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Permutation in Python zu implementieren
Django super Einführung von Python-Anfängern! Teil 3 Ich habe versucht, die Vererbungsfunktion für Vorlagendateien zu verwenden
Wie man offline in Echtzeit schreibt Ich habe versucht, E11 mit Python zu lösen
Ich habe versucht, PLSA in Python 2 zu implementieren
Python3-Standardeingabe habe ich versucht zusammenzufassen
Ich wollte ABC160 mit Python lösen
Ich habe versucht, PyEZ und JSNAPy zu verwenden. Teil 2: Ich habe versucht, PyEZ zu verwenden
Ich habe versucht, ADALINE in Python zu implementieren
Ich habe versucht, Optuna die Nummer lösen zu lassen
Ich habe versucht, einen Formatierer zu entwickeln, der Python-Protokolle in JSON ausgibt
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
Ich habe versucht, Kanas handschriftliche Zeichenerkennung durchzuführen. Teil 2/3 Datenerstellung und Lernen
Ich wollte ABC159 mit Python lösen
Ich habe versucht, PPO in Python zu implementieren
10 Python-Fehler, die Anfängern häufig sind
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, AtCoders Depth Priority Search (DFS) in Python zu lösen (Ergebnis: TLE ...)
Ich habe versucht, TSP mit QAOA zu lösen
[Python] Ich habe versucht, TF-IDF stetig zu berechnen
[Markov-Kette] Ich habe versucht, Zitate und negative Emotionen in Python einzulesen.
Ich habe versucht, Python zu berühren (grundlegende Syntax)
Ich habe ein Beispiel für den Zugriff auf Salesforce mit Python und Bottle erstellt
Ich wollte ABC172 mit Python lösen