[PYTHON] AtCoder Beginner Contest 104 Rückblick auf frühere Fragen

Benötigte Zeit

スクリーンショット 2020-05-20 22.58.36.png

Impressionen

Es ist nicht gut, dass Sie das Problem im D-Level-Band nicht lösen können. ** Ich konnte meine Intelligenz nicht zusammenpressen, um Hinweise zu finden **. Ich werde versuchen, während des Wettbewerbs fest zu sein.

Problem A

Sie können es durch weniger als 1200 oder weniger als 2800 teilen. Mit dem ternären Operator ist das Schreiben einfach.

answerA.py


r=int(input())
print("ABC" if r<1200 else "ARC" if r<2800 else "AGC")

B-Problem

Obwohl es ein B-Problem war, war es ziemlich problematisch. Die zweite Bedingung kann leicht verarbeitet werden, aber die letzte Bedingung besteht darin, nur den relevanten Teil der Zeichenkette zu extrahieren und zu beurteilen, ob sie alle in Kleinbuchstaben geschrieben sind. Mit der Funktion islower () können Sie feststellen, ob sie niedriger ist.

answerB.py


s=input()

if s[0]=="A" and s[2:-1].count("C")==1:
    if (s[1]+s[2:2+s[2:-1].index("C")]+s[s[2:-1].index("C")+3:]).islower():
        print("AC")
    else:
        print("WA")
else:
    print("WA")

C-Problem

Dieses Problem wurde schnell entschieden, aber ich habe einen dummen Fehler gemacht (** break-Anweisung wurde vergessen ** und ** Variable wurde falsch geschrieben **).

Wenn Sie normal darüber nachdenken, sollten Sie zunächst diejenigen mit der höchsten Grundpunktzahl auswählen. Abhängig von der Gesamtpunktzahl ändert sich jedoch der zu lösende Problempunkt **.

Hier konzentrierte ich mich auf die Tatsache, dass es nur D ($ \ leqq $ 10) Arten von Problemen gibt, und dachte, dass ** ich entscheiden sollte, welches Problem für jedes ** abgeschlossen werden soll **. Mit anderen Worten, Sie können alle Problemgruppen durchsuchen, die durch eine vollständige Bit-Suche abgeschlossen werden sollen.

Sobald Sie entschieden haben, welche Fragen zu beantworten sind, können Sie unter den Fragen, die Sie nicht auswählen, diejenigen mit der höchsten Punktzahl (✳︎) auswählen. Da das zu lösende Problem behoben ist, kann (✳︎) nicht abgeschlossen werden, und ** wenn Sie keinen G-Punkt oder höher erhalten, ohne ihn zu vervollständigen, müssen Sie das folgende Muster berücksichtigen **.

answerC.py


import math
d,g=map(int,input().split())
pc=[list(map(int,input().split())) for i in range(d)]
ans=10000000000000000000
for i in range(1<<d):
    s=0
    ans_=0
    for j in range(d):
        if (i>>j)&1:
            s+=(pc[j][1]+pc[j][0]*100*(j+1))
            ans_+=pc[j][0]
    if s>=g:
        ans=min(ans,ans_)
    else:
        for j in range(d-1,-1,-1):
            if not((i>>j)&1):
                if s+(pc[j][0]*100*(j+1))>=g:
                    h=-((s-g)//(100*(j+1)))
                    s+=(h*100*(j+1))
                    ans_+=h
                    ans=min(ans,ans_)
                    break
                else:
                    break
print(ans)

D Problem

Zuerst dachte ich, dass ich nicht gut in Zeichenketten bin (vielleicht weil es viele DP-Muster gibt), aber am Ende hatte ich einen Schwanz ... ** Sie müssen Ihre Schwächen loswerden und das Problem angehen **….

Da die Anzahl der ABCs ** in der Reihenfolge (allmählich) von vorne nach A, B, C ** bestimmt werden kann, kann vermutet werden, dass DP verwendet werden kann (auch Experimente mit der Probe $ \ weil $). Machen). Da es schwierig ist, sofort an A → B → C zu denken, können Sie sich vorstellen, dass Sie sich getrennt für A → B und B → C entscheiden sollten (✳︎).

Daher können Sie (✳︎) verwenden, während Sie ** DP verwenden, wenn Sie es in den Zustand unterteilen, in dem ** A entschieden wird, den Zustand, in dem AB entschieden wird, und den Zustand, in dem ABC entschieden wird. Die Diskussion war bisher ziemlich gut, aber ich konnte die Verarbeitung eines Charakters nicht vollständig in Betracht ziehen.

In der Tat? Kann einfach ** A, B, C sein, indem alle drei Muster ausprobiert und addiert werden **. Tatsächlich ist auch ein Zustand, in dem nichts entschieden wurde, als Staat erforderlich. Fügen Sie diesen hinzu.

Aus der obigen Überlegung können wir erkennen, dass der folgende dp definiert werden sollte.

IMG_0382.PNG

(Als ich DP definierte, hielt ich es für wichtig, zu verbalisieren, was jeder Zustand ist.)

Wenn Sie sich bisher entschieden haben **, können Sie über den Übergang nachdenken **. Es gibt viele Muster, in denen der Übergang $ dp [i] [j] = dp [i-1] [j] $ ist, aber das Muster nimmt zu, abhängig davon, ob das $ i $ -te Zeichen $ A, B oder C $ ist. Ich werde. Das heißt, wenn das i-te Zeichen A ist, muss das Muster von $ dp [i-1] [3] $ zu $ dp [i] [0] $ hinzugefügt werden, und wenn das i-te Zeichen B ist, muss das Muster hinzugefügt werden. Es ist notwendig, das Muster von $ dp [i-1] [0] $ zu $ dp [i] [1] $ hinzuzufügen, und wenn das i-te Zeichen C ist, $ dp [i] [2] $ zu $ Sie müssen das Muster von dp [i-1] [1] $ hinzufügen. Wenn das i-te Zeichen? Ist, gibt es außerdem Muster von A, B und C. Wenn Sie also alle addieren, ist $ dp [i] = [3 * dp [i-1] [0] + dp [i-1] [3], 3 · dp [i-1] [1] + dp [i-1] [0], 3 · dp [i-1] [2] + dp [i-1] [ Es wird 1], 3 * dp [i-1] [3]] $.

Dies reicht nicht aus, aber die folgende Abbildung kann das Beispiel der ersten Stichprobe erläutern (drei sind vertikal angeordnet, wenn? Ist A und B ist. Wenn es C.) war.

IMG_0383.JPG

Das Obige ist implementiert und wird wie folgt. Es ist leicht, einen Fehler in dp [0] zu machen, daher müssen Sie vorsichtig sein.

✳︎ ** Da gierige Probleme und Teilstring-Probleme eine hohe Wahrscheinlichkeit für DP haben ** von früher **, möchte ich ruhig eine Richtlinie erstellen ** und ** über den tatsächlichen Übergang sorgfältig nachdenken ** Ich würde gerne vorsichtig sein.

answerD.py


mod=10**9+7
s=input()
l=len(s)
dp=[[0]*4 for i in range(l)]
for i in range(l):
    if i==0:
        dp[i][3]=1
        if s[i]=="A":
            dp[i][0]=1
        elif s[i]=="?":
            dp[i][0]=1
            dp[i][3]=3
    else:
        if s[i]=="A":
            dp[i]=[(dp[i-1][0]+dp[i-1][3])%mod,dp[i-1][1],dp[i-1][2],dp[i-1][3]]
        elif s[i]=="B":
            dp[i]=[dp[i-1][0],(dp[i-1][0]+dp[i-1][1])%mod,dp[i-1][2],dp[i-1][3]]
        elif s[i]=="C":
            dp[i]=[dp[i-1][0],dp[i-1][1],(dp[i-1][1]+dp[i-1][2])%mod,dp[i-1][3]]
        else:
            dp[i]=[(3*dp[i-1][0]+dp[i-1][3])%mod,(3*dp[i-1][1]+dp[i-1][0])%mod,(3*dp[i-1][2]+dp[i-1][1])%mod,(3*dp[i-1][3])%mod]
print(dp[-1][2])

Recommended Posts

AtCoder Beginner Contest 102 Rückblick auf frühere Fragen
AtCoder Beginner Contest 072 Rückblick auf frühere Fragen
AtCoder Beginner Contest 085 Rückblick auf frühere Fragen
AtCoder Beginner Contest 113 Rückblick auf frühere Fragen
AtCoder Beginner Contest 074 Rückblick auf frühere Fragen
AtCoder Beginner Contest 051 Rückblick auf frühere Fragen
AtCoder Beginner Contest 127 Rückblick auf frühere Fragen
AtCoder Beginner Contest 119 Rückblick auf frühere Fragen
AtCoder Beginner Contest 151 Rückblick auf frühere Fragen
AtCoder Beginner Contest 075 Rückblick auf frühere Fragen
AtCoder Beginner Contest 054 Rückblick auf frühere Fragen
AtCoder Beginner Contest 110 Rückblick auf frühere Fragen
AtCoder Beginner Contest 117 Rückblick auf frühere Fragen
AtCoder Beginner Contest 070 Rückblick auf frühere Fragen
AtCoder Beginner Contest 105 Rückblick auf frühere Fragen
AtCoder Beginner Contest 112 Rückblick auf frühere Fragen
AtCoder Beginner Contest 076 Rückblick auf frühere Fragen
AtCoder Beginner Contest 069 Rückblick auf frühere Fragen
AtCoder Beginner Contest 056 Rückblick auf frühere Fragen
AtCoder Beginner Contest 087 Rückblick auf frühere Fragen
AtCoder Beginner Contest 067 Rückblick auf frühere Fragen
AtCoder Beginner Contest 093 Rückblick auf frühere Fragen
AtCoder Beginner Contest 046 Rückblick auf frühere Fragen
AtCoder Beginner Contest 049 Rückblick auf frühere Fragen
AtCoder Beginner Contest 081 Rückblick auf frühere Fragen
AtCoder Beginner Contest 047 Rückblick auf frühere Fragen
AtCoder Beginner Contest 060 Rückblick auf frühere Fragen
AtCoder Beginner Contest 104 Rückblick auf frühere Fragen
AtCoder Beginner Contest 057 Rückblick auf frühere Fragen
AtCoder Beginner Contest 121 Rückblick auf frühere Fragen
AtCoder Beginner Contest 126 Rückblick auf frühere Fragen
AtCoder Beginner Contest 090 Rückblick auf frühere Fragen
AtCoder Beginner Contest 103 Rückblick auf frühere Fragen
AtCoder Beginner Contest 061 Rückblick auf frühere Fragen
AtCoder Beginner Contest 059 Rückblick auf frühere Fragen
AtCoder Beginner Contest 044 Rückblick auf frühere Fragen
AtCoder Beginner Contest 083 Rückblick auf frühere Fragen
AtCoder Beginner Contest 048 Rückblick auf frühere Fragen
AtCoder Beginner Contest 124 Rückblick auf frühere Fragen
AtCoder Beginner Contest 116 Rückblick auf frühere Fragen
AtCoder Beginner Contest 097 Rückblick auf frühere Fragen
AtCoder Beginner Contest 088 Rückblick auf frühere Fragen
AtCoder Beginner Contest 092 Rückblick auf frühere Fragen
AtCoder Beginner Contest 099 Rückblick auf frühere Fragen
AtCoder Beginner Contest 065 Rückblick auf frühere Fragen
AtCoder Beginner Contest 053 Rückblick auf frühere Fragen
AtCoder Beginner Contest 094 Rückblick auf frühere Fragen
AtCoder Beginner Contest 063 Rückblick auf frühere Fragen
AtCoder Beginner Contest 107 Rückblick auf frühere Fragen
AtCoder Beginner Contest 071 Rückblick auf frühere Fragen
AtCoder Beginner Contest 064 Rückblick auf frühere Fragen
AtCoder Beginner Contest 082 Rückblick auf frühere Fragen
AtCoder Beginner Contest 084 Rückblick auf frühere Fragen
AtCoder Beginner Contest 068 Rückblick auf frühere Fragen
AtCoder Beginner Contest 043 Rückblick auf frühere Fragen
AtCoder Beginner Contest 098 Rückblick auf frühere Fragen
AtCoder Beginner Contest 114 Rückblick auf frühere Fragen
AtCoder Beginner Contest 045 Rückblick auf frühere Fragen
AtCoder Beginner Contest 120 Rückblick auf frühere Fragen
AtCoder Beginner Contest 108 Rückblick auf frühere Fragen