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

Benötigte Zeit

スクリーンショット 2020-04-14 12.40.37.png

Impressionen

Ich konnte die WA für das D-Problem nicht bekommen, also musste ich ungefähr zwei Stunden nach dem Wettbewerb verbringen, um die WA zu bekommen. Außerdem war die Idee richtig und nur eine Zeile war falsch. Es war schmerzhaft. Außerdem war es ein dummer Fehler, deshalb würde ich gerne darüber nachdenken und es beim nächsten Mal nutzen.

Problem A

Teilen Sie das Produkt der Seiten, die den rechten Winkel einschließen, durch 2.

answerA.py


a,b,_=map(int,input().split())
print(a*b//2)

B-Problem

Mit anderen Worten, Sie können den Index ausgeben, wenn er zum zweiten Mal herauskommt. Verwalten Sie also die Zahlen mit set und geben Sie den Index aus, wenn die bereits eingestellten Zahlen herauskommen und brechen. Das ist gut.

answerB.py


x=set()
s=int(input())
ans=0
while True:
    ans+=1
    if s in x:
        print(ans)
        break
    x.add(s)
    
    if s%2==0:
        s=s//2
    else:
        s=3*s+1

C-Problem

Persönlich war es wirklich schwierig. Anstatt zu gießen, um die Höhe der Blumen zu erhöhen, dachte ich daran, sie von der endgültigen Höhe der Blumen abzusenken, um alle Höhen der Blumen auf 0 zu bringen. Zu diesem Zeitpunkt wird auch die Mindestanzahl für den Teil ausgewählt, bei dem andere Zahlen als ** fortlaufend sind, und die Nummer des ausgewählten Teils wird um diese Zahl reduziert. ** Der Vorgang wird wiederholt, sodass die anderen Zahlen als 0 fortlaufend sind. Es ist notwendig, den Index des linken Endes abzurufen und das rechte Ende des Teils ((1) und (2) entsprechen ihm). Da die Operation zum Auswählen der Mindestanzahl in (2) gleichzeitig ausgeführt wird, wird die Höhe um die Mindestanzahl in (3) verringert. Sie können das Problem lösen, indem Sie zusammenfassen, um wie viel Sie die Höhe aller Blumen gesenkt haben, bis Sie die Höhe aller Blumen auf 0 reduziert haben.

answerC.py


n=int(input())
h=list(map(int,input().split()))
ans=0
while True:
    l,m=-1,-1
    #(1)
    for i in range(n):
        if h[i]!=0:
            l=i
            break
    if l==-1:
        break
    if l==n-1:
        ans+=h[l]
        break
    r=l
    #(2)
    for i in range(l,n):
        if h[i]==0:
            break
        else:
            r=i
            if m==-1:
                m=h[i]
            else:
                m=min(m,h[i])
    #(3)
    for i in range(l,r+1):
        h[i]-=m
    ans+=m
print(ans)

D Problem

Zuerst habe ich versucht, die Art des Materials zu korrigieren **, aber ich dachte nicht, dass es eine effektive Möglichkeit gibt, die Art zu bestimmen, deshalb habe ich es sofort abgelehnt. Wenn Sie hier die gleiche Art von Material essen möchten, dachte ich, dass es besser ist, das mit den höchsten Grundgeschmackspunkten zu wählen. Ordnen Sie also zuerst ** in absteigender Reihenfolge der Grundköstlichkeitspunkte an und wählen Sie das K-te Material aus ** Ich dachte. Hier ist es notwendig, die Typen zu erhöhen und die Typbonuspunkte zu erhöhen, um die Zufriedenheitspunkte zu erhöhen, während das Material mit einem niedrigeren Grundpunkt der Köstlichkeit als das K-Material ausgewählt wird. Außerdem ist das Material, das den Typbonus erhöht, ** das mit den höchsten Grundpunkten der Köstlichkeit unter den Materialtypen, die noch nie zuvor gesehen wurden **. Darüber hinaus dürfen für das Material, das bei der Auswahl eines Materials ausgeschlossen wird, das den Typbonus erhöht, ** die Typbonuspunkte nicht gesenkt werden **, also ** die köstlichsten Grundpunkte des Materialtyps mit zwei oder mehr Materialtypen Ist niedrig **. Da es notwendig ist, aufzuzeichnen, wie viele Arten von Material bisher aufgenommen wurden, wird es in einem Wörterbuch namens kl gespeichert. Daher wäre es gut, diese gehorsam umzusetzen, aber die Umsetzung war ein wenig mühsam. Daher ** habe ich vergessen, die Variable now auf -1 zu setzen, um das nächste Material nach dem Entfernen des Materials zu scannen **, und die Überprüfung dauerte ungefähr zwei Stunden. Ich habe diese Überprüfung auch nach dem Bachacon durchgeführt, aber sie war langsam, da ** jetzt nicht gespeichert wurde und alle Indizes von 0 bis k-1 jedes Mal während des Bachacons gescannt wurden **. Ich möchte sicherstellen, dass das Programm verbessert wird, sobald ich der Meinung bin, dass der Rechenaufwand verdächtig ist. Außerdem dachte ich, dass der Code schwer zu lesen sein würde, wenn andere ihn lesen, deshalb habe ich im Kommentar viele Notizen hinterlassen. Bitte beachten Sie auch den Kommentar aus dem Code.

answerD.py


n,k=map(int,input().split())
#td ist in der Reihenfolge der Größe angeordnet
td=sorted([list(map(int,input().split())) for i in range(n)],reverse=True,key=lambda x:x[1])

#Das Folgende ist ein Code, um den Zufriedenheitspunkt zu finden, wenn Sie den Punkt mit dem höchsten Grundpunkt der Köstlichkeit bis zum k-ten auswählen
ans=0
kl=dict()
for i in range(k):
    ans+=td[i][1]
    if td[i][0] in kl:
        kl[td[i][0]]+=1
    else:
        kl[td[i][0]]=1
l=len(kl)
ans+=(l**2)
ans_=ans

#Unten finden Sie den Code für die Auswahl des Materials zur Erhöhung der Typbonuspunkte
now=k-1 #Das Material, das ausgeschlossen werden kann, ist 0~Bisher nach Index suchen
for i in range(k,n): #Das Material, das die Typbonuspunkte erhöht, ist k~n-Suche in der Reihenfolge nach Index bis 1
    if td[i][0] not in kl: #Bei bisher nicht ausgewähltem Material
        while now>=0: #Gibt es Material, das entfernt werden kann?(now<Wenn es 0 ist, ist das Scannen beendet und endet.)
            if kl[td[now][0]]>1: #Es können nur Materialtypen ausgeschlossen werden, die mehr als ein Material enthalten
                mi=td[now] #Notieren Sie sich die Arten des auszuschließenden Materials und die grundlegenden Punkte der Köstlichkeit
                kl[mi[0]]-=1 #Reduzieren Sie die Anzahl dieser Art von Material um eins
                now-=1 #Scannen Sie vom nächsten entfernten Material
                break
            now-=1 #Wenn nur ein Material vorhanden ist, scannen Sie das nächste
        if now==-1: #Wenn Sie mit dem Scannen fertig sind
            break
        else:
            ans=ans+2*l+1-mi[1]+td[i][1] #Beachten Sie die Zufriedenheitspunkte, wenn Sie die Typbonuspunkte erhöhen(aktualisieren)
            kl[td[i][0]]=1 #Notieren Sie die Art des Materials
            ans_=max(ans,ans_)#Aktualisieren Sie, wenn die Zufriedenheitspunkte überschritten werden
            l+=1 #Erhöhen Sie die Art des Materials um eins(Ich dachte, es wäre zu spät, um es mit len zu bekommen)
print(ans_)

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 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 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
AtCoder Beginner Contest 106 Rückblick auf frühere Fragen
AtCoder Beginner Contest 122 Rückblick auf frühere Fragen