[PYTHON] AtCoder Ich kenne Tagebuch_1 ABC148D nicht

Einführung

Ich habe zum ersten Mal am AtCoder-Wettbewerb teilgenommen. Ich habe die letzten Fragen nur ein wenig gelöst. Ich bin wirklich ein Anfänger, aber ich denke, C ist so einfach und D kann verwendet werden. Ich dachte, also habe ich es gelöst. Es hat nicht rechtzeitig funktioniert. Die Antwort eines programmierstarken Mannes (Tsuyobito) ist für Anfänger zu klug. e? Gibt es eine Möglichkeit, solche Eingaben zu erhalten? !! Ist es eine Ameise, wie man es ausgibt? !! Es wird so sein. Ich werde mich widmen. Vorerst möchte ich darüber nachdenken, warum der Algorithmus, den ich fand, nicht gut war. Es macht keinen Sinn, wenn Sie die Operationen, die Sie als Code betrachten, nicht aufschreiben können. Das Problem stammt aus dem D-Problem von ABC148. Hier ist ein Zitat (ich werde die Regeln befolgen, aber bitte lassen Sie mich wissen, wenn es falsch ist).

(Ergänzung, die keine Rolle spielt) Ich habe noch kein Ameisenbuch gekauft. Weil ich einen kleinen Geldbetrag habe. Wenn es in der Schulbibliothek ist, kann ich es für die Jahresend- und Neujahrsferien mieten. Ich dachte, ich wollte, dass er es kauft, aber ich habe einen Fehler in der Richtung gemacht, also war ich zu Hause. ・ Algorithmus Lehrbuch-Grundlagen und Anwendungen von Algorithmen in praktischen Programmen gezeigt- ・ Algorithmus-Puzzle-Einführung in mathematische Puzzles für Programmierer- Ich wollte mir dieses Buch leihen und zuerst den Algorithmus lernen, also fand ich es okay. Das frühere Buch ist älter als ich ...

D - Brick Break

N Steine sind in einer horizontalen Reihe aufgereiht. Die ganze Zahl a i </ sub> wird von links auf den i (1 ≤ i ≤ N) -ten Stein geschrieben. Sie können jeden Stein aus N-1 oder weniger auswählen und zerkleinern. Infolgedessen bleiben K Steine übrig. Zu diesem Zeitpunkt ist Herr Sunuke für jede ganze Zahl i (1 ≤ i ≤ K) zufrieden, wenn die ganze Zahl, die in der i-ten von links unter den verbleibenden Steinen geschrieben ist, i ist. Bitte geben Sie die Mindestanzahl an Steinen aus, die Herr Sunuke zerdrücken muss, um zufrieden zu sein. Wenn dies nicht möglich ist, egal wie Sie es zerdrücken, drucken Sie stattdessen -1.

Gedanken

(1) Es scheint, dass die Zahlen in der Reihenfolge von 1 bleiben sollten. ② Dann sollte ich es mit dem Index von vorne überprüfen und den anderen löschen [^ 1] Wie entscheiden Sie sich für eine richtige Nomenklatur? Und was war das Element der Metapher und warum? Eine solche. [^ 1]: Dies ist ein Fehler. Sie müssen es nur zählen. Was an erster Stelle benötigt wird, ist nicht die endgültige Folge von Zahlen. Lesen Sie das Problem richtig

Erstes Mal

n = int(input())
a = list(map(int, input().split()))
ans = 0
i = 0
while i + 1 <= len(a):
    #index+Löschen, wenn 1 vom Listenelement abweicht
    if a[i] != i + 1:
        del a[i]
    #Wenn sie identisch sind, überprüfen Sie das nächste Element
    else:
        i += 1
#Unmöglich, wenn Sie alles löschen
if len(a) == 0:
  print(-1)
#Wenn Sie die verbleibenden Elemente subtrahieren, ist dies die Zahl, die Sie gebrochen haben
else:
    print(n - len(a))

In einigen Testfällen zu TLE. Hmmm, ich habe eine Weile darüber nachgedacht, aber ich weiß nicht, was los ist ... Ich bin nicht sicher, ob es definitiv richtig ist. Ist es nicht TLE in einer Endlosschleife, aber die Zeit ist vorbei, wenn der Testfall zu lang ist? Ich verstehe nicht ganz, wie das funktioniert. Danach machte ich mir Sorgen, es auf dem Weg zu brechen, aber es war überhaupt nicht wichtig, also ließ ich es weg.

4 ..

③ Es war vielleicht nicht gut, weil ich sie einzeln gelöscht habe. Sie können alles auf einmal löschen. Damit,

n = int(input())
a = list(map(int, input().split()))
ans = 0
i = 0
while i + 1 <= len(a):
    #index+Wenn sich 1 vom Listenelement unterscheidet
    if a[i] != i + 1:
        #Überprüfen Sie, ob das richtige Element vorhanden ist
        if i + 1 in a:
            #Vor dem richtigen Element löschen
            del a[i:a.index(i + 1)]
        #Löschen Sie alle, wenn kein korrektes Element vorhanden ist
        else:
            del a[i:]      
    #index+Wenn 1 mit dem Element in der Liste identisch ist, fahren Sie mit dem nächsten Element fort
    else:
        i += 1
#Unmöglich, wenn Sie alles löschen
if len(a) == 0:
  print(-1)
#Wenn Sie die verbleibenden Elemente subtrahieren, ist dies die Zahl, die Sie gebrochen haben
else:
    print(n - len(a))

Ich ging daran vorbei. Du hast es geschafft. Antwort des starken Mannes (Tsuyobito)

Es spielt überhaupt keine Rolle, aber Sie können es separat lesen. ~~ Es sieht aus wie ein Verrückter. ~~ [^ 2]

――Der kürzeste Code im Moment, ich habe geweint, weil ich die Bedeutung überhaupt nicht verstanden habe [^ 3] [^ 4]

Aus irgendeinem Grund habe ich versucht, eine saubere Linie von Ziegeln zu finden, aber es scheint, als müsste ich nur die Anzahl der sauber ausgekleideten Steine zählen.

Es wird ein ternärer Operator genannt

Es scheint, dass Sie if- und else-Anweisungen in eine Zeile schreiben können.

(Wenn true, geben Sie dies zurück) if (unter dieser Bedingung) else (Wenn false, ist dies der Fall)

So was. Ich brauche nicht einmal einen Doppelpunkt. Es ist bequem. Also die letzten 4 Zeilen

print(-1 if len(a) == 0 else n - len(a))

Das ist gut. Aha! Lernen. [^ 2]: Compla [^ 3]: Übertriebener Ausdruck [^ 4]: Es ist momentan nicht das Ziel, den stärksten Code zu schreiben. Es ist wichtig, das Problem so weit wie möglich zu lösen. Machen Sie sich also keine Sorgen.

Recommended Posts

AtCoder Ich kenne Tagebuch_1 ABC148D nicht
AtCoder Ich kenne Tagebuch_2 ABC148E nicht
AtCoder Ich kenne kein Tagebuch_3 ABC149C, D.
AtCoder Ich kenne kein Tagebuch_4 ABC081B, 087B, 083B (von ABS)
Ich kenne den Wertfehler nicht
Ich verstehe nicht mitmachen
Atcoder Anfängerwettbewerb 146 Teilnahme Tagebuch
Ich habe an AtCoder (ABC158) teilgenommen.
Ich weiß nicht, wie ich Abfrageparameter in GAE / P erhalten soll
Ich kannte den Lucas-Satz nicht, der in Atcoder natürlich herauskam