[PYTHON] AtCoder Grand Contest 041 Bewertung

Ich möchte die AGC041 überprüfen, die ich neulich hatte.

Die Ergebnisse dieser Zeit

スクリーンショット 2020-01-01 11.01.52.png

Ich denke, ich kann meine Punktzahl verbessern, weil ich sie zum ersten Mal abschließen konnte, aber ich musste meine Meinung über das C-Problem nur ein wenig ändern, deshalb wollte ich sie dreimal abschließen.

Problem A

Ich habe relativ schnell eine Lösung gefunden, aber ich habe 2WA ausgespuckt, weil ich schnell eine Lösung eingereicht habe, die eindeutig falsch war, und Python-Code als C ++ - Code eingereicht habe. Erstens ist es am einfachsten zu verstehen, wenn der Abstand zwischen Tabelle A und Tabelle B gerade ist. In diesem Fall sollten die Tischtennisspieler an jedem Tisch den Abstand zwischen den Tischen um 2 verringern und den Abstand geteilt durch 2 ausgeben. Als nächstes müssen wir den Fall betrachten, in dem der Abstand zwischen Tabelle A und Tabelle B ungerade ist. In diesem Fall können Sie den Abstand zwischen den beiden Tischen auch dann einstellen, indem Sie bis zum Ende (Tabelle 1 oder Tabelle N) gehen und dort in einer Runde bleiben. Zu diesem Zeitpunkt ist es notwendig, diejenige näher am Ende zu betrachten, so dass es ausreicht, die min-Seite mit c und d im folgenden Code auszugeben. (Wenn Sie die Formel hier richtig codieren, wird sie zu WA.) Der Schlüssel zu diesem Problem ist ** die Klassifizierung des Zustands während des Übergangs **. In diesem Problem können Sie sehen, dass Sie nur ** ** nicht zu einem anderen Tisch wechseln können, wenn Sie an Tabelle 1 gewinnen und wenn Sie an Tabelle N verlieren. Es ist auch leicht zu berücksichtigen, dass die Fälle, in denen beide nahe beieinander liegen, deutlich minimiert sind. In diesem Fall ist der Abstand gleichmäßig, und wenn sie sich am Rand befinden, ändert sich die Gleichmäßigkeit.

answerA.py


x=[]
n,a,b=map(int,input().split())
if (b-a)%2==0:
    print((b-a)//2)
else:
    c=(a-1)+(b-a+1)//2
    d=(n-b)+(b-a+1)//2
    print(min(c,d))

B-Problem

Ordnen Sie die Personen vorerst in absteigender Reihenfolge an. Zu diesem Zeitpunkt können die Fragen A1 bis Ap bedingungslos angenommen werden, da Frage P im Wettbewerb angenommen wird. Wenn Sie hier die Frage von Ap ändern können, die die niedrigste Punktzahl unter den P-Fragen aufweist, und eine kleinere Frage auswählen können, kann die Frage in den Wettbewerb übernommen werden. Wenn v <= p, stimmen Sie weiterhin für A1 ~ Ap-1 und Aj (j> = p + 1) und wissen Sie, dass Aj Ap überschreiten kann. Andererseits gibt es im Fall von v> p immer noch mehr Stimmen für Aj (j> = p + 1), selbst wenn alle Richter für A1 ~ Ap-1, Aj und ** Aj stimmen, die Ap überschreiten. Sie können sehen, dass es nicht möglich ist, nur mit ** zu urteilen (denn wenn es in Ap eine Abstimmung gibt, kann diese Aj überschreiten). Wenn wir nun überlegen, wie wir die verbleibenden Stimmen für den Richter auswählen sollen, müssen wir auch beachten, dass wir Aj überschreiten werden, selbst wenn wir für Ak (k> j + 1) stimmen. Mit anderen Worten, selbst wenn Sie für A1 ~ Ap-1 und Aj ~ An stimmen (zu diesem Zeitpunkt beträgt die Punktzahl der gestimmten Frage + m) und die verbleibenden Stimmen des Richters in Ap ~ Aj-1 eingeben, wird Aj dies tun Es kann gesagt werden, dass Aj in den Wettbewerb aufgenommen werden kann, wenn es Al (p <= l <= j-1) oder mehr für ein l ist. Sie können auch sehen, dass Ap ~ Aj-1 gleich Aj ist, wenn die verbleibenden Stimmen des Richters ** maximal gewählt werden, so dass Ap Aj nicht überschreitet (zu diesem Zeitpunkt ist Ap ~ Aj-1 das Original Da es größer als Aj ist, ist garantiert, dass die maximale Anzahl von Stimmen für jedes m nicht überschreitet.) Außerdem sind sie in absteigender Reihenfolge angeordnet, und ** Sie können nach einem bestimmten Aj nicht mehr am Wettbewerb teilnehmen, sodass Sie nach Dichotomie nach einem solchen Aj suchen können **. Um das Innere der Adoptionsfunktion zu erklären, müssen zunächst A1 bis Ap-1 nicht berücksichtigt werden, daher werden sie als [p-1:] geschnitten. b ist der Wert, wenn maximal für Ax + p + 1 gestimmt wird (x wird als 0-Index betrachtet). Wenn b nicht mehr als Ap ist, kann es nicht übernommen werden, daher wird False zurückgegeben (1), al gilt für alle Richter Bei der Gesamtzahl der Stimmen (jedoch wird A1 ~ Ap-1, Axe + p + 1 ~ An abstimmen, daher habe ich diesen Betrag bereits abgezogen) sind alle Stimmen der Richter aufgebraucht, wenn al 0 oder weniger ist Daher wird True zurückgegeben (2), s ist die Anzahl der Stimmen, die erforderlich sind, um Ap ~ Ax + p Ax + p + 1 (b) zu machen. Wenn al s überschreitet, False, andernfalls True. Zurückgeben.

answerB.py


n,m,v,p=map(int,input().split())
a=[int(i) for i in input().split()]
a.sort(reverse=True)
a=a[p-1:]
le=len(a)
l,r=0,le-1

def adopt(x):
    global a,n,m,v,p
    b=a[x]+m
    #(1)
    if b<a[0]:
        return False
    al=v*m
    al-=(n-x)*m
    #(2)
    if al<=0:
        return True
    s=x*b-sum(a[:x])
    #(3)
    if al>s:
        return False
    else:
        return True

while l+1<r:
    k=(l+r)//2
    if adopt(k):
        l=k
    else:
        r=k

if adopt(r):
    print(p+r)
else:
    print(p+l)

Code, den ich nach dem Wettbewerb sowohl am kürzesten als auch am schnellsten anstrebte ↓ (Es wurde ein halbfertiger Code, der weder sehr kurz noch früh war.)

answerB_better.py


n,m,v,p=map(int,input().split())
a=sorted(list(map(int, input().split())),reverse=True)[p-1:]
l,r=0,n-p
while l+1<r:
    k=(l+r)//2
    b=a[k]+m
    if b<a[0] or (v-(n-k))*m>(k*b-sum(a[:k])): r=k
    else: l=k
b=a[r]+m
print(p+l if(b<a[0] or (v-(n-r))*m>(r*b-sum(a[:r]))) else p+r)

C-Problem

Ich konnte es während des Wettbewerbs nicht lösen. Entsprechend der Überlegung während des Wettbewerbs ist es notwendig, die Anzahl der vertikal und horizontal platzierten Dominosteine auszugleichen. Wenn sie ausgeglichen werden, kann die Qualität auf 3 gesetzt werden, um eine Anordnung von Dominosteinen zu erstellen, die die Bedingungen erfüllen. Es stellt sich heraus (außer wenn n = 2,3). Wenn hier die Dominosteine unter Berücksichtigung der Symmetrie angeordnet wurden und n ein Vielfaches von 3 war, konnten wir die Anordnung der Dominosteine der Qualität 1 finden, indem wir die Dominosteine vertikal und horizontal in der Reihenfolge entlang der diagonalen Linie anordneten. Ich konnte jedoch keine hochsymmetrische Anordnung finden, wenn n kein Vielfaches von 3 war (** Ich sollte hier eine andere Methode in Betracht ziehen **). ** Große Zahlen funktionieren oft gut, wenn sie geteilt werden **. Denken Sie also auch an dieses Problem. Wenn man sich auf die partielle quadratische Matrix von der i-ten Reihe bis zur j-ten Reihe und der i-ten bis j-ten Spalte konzentriert, ist der Teil von der i-ten Reihe bis zur j-ten Reihe und der i-ten bis j-ten Spalte außer dieser quadratischen Matrix 0. Wenn ja, können Sie sehen, dass die Qualität der partiellen quadratischen Matrix von Zeile i zu Spalte j und von Spalte i zu Spalte j reicht. Daher wissen wir, dass wir eine solche partielle quadratische Matrix konstruieren sollten. In Anbetracht der Matrix, deren Qualität 3 oben ist, habe ich das Gefühl, dass sie in einer quadratischen Matrix 4. Ordnung oder höher zu finden scheint. Von hier aus werde ich mein Bestes geben, um eine solche quadratische Matrix zu finden. Bei Betrachtung der Methode von Antwort fand ich eine quadratische Matrix der Ordnung 3,4,5,6,7 und teilte die Fälle mit mod4, um sie quadratisch zu machen. Sie können quadratische Matrizen in der Reihenfolge auf der Diagonale der Matrix anordnen. (Von oben gezählt, ist es 4., 4., 4., ..., (4or5or6or7) Es ist wie folgt ausgerichtet.) Ich benutze mod6, um Fälle zu klassifizieren, in denen n ein Vielfaches von 3 ist, weil es eine einfache Anordnung gibt. Die Lösungsmethode ist jedoch wahrscheinlich die einfachste Methode, da eine quadratische Matrix der Ordnung 3,4,5,6,7,8 gefunden werden muss.

answerC.py


n=int(input())

if n==2:
    print(-1)
else:
    x=[]
    if n%3==0:
        for i in range(n//3):
            x.append("."*(3*i)+"a"+"."*(n-3*i-1))
            x.append("."*(3*i)+"a"+"."*(n-3*i-1))
            x.append("."*(3*i)+".aa"+"."*(n-3*i-3))
    elif n%6==1:
        for i in range(n//6-1):
            x.append("."*(6*i)+".a.b.c"+"."*(n-6*i-6))
            x.append("."*(6*i)+".a.b.c"+"."*(n-6*i-6))
            x.append("."*(6*i)+"ddg.ll"+"."*(n-6*i-6))
            x.append("."*(6*i)+"e.g.kk"+"."*(n-6*i-6))
            x.append("."*(6*i)+"e.hhj."+"."*(n-6*i-6))
            x.append("."*(6*i)+"ffiij."+"."*(n-6*i-6))
        x.append("."*(n-7)+".aab.c.")
        x.append("."*(n-7)+"d..b.c.")
        x.append("."*(n-7)+"d..eeff")
        x.append("."*(n-7)+"g..mm.l")
        x.append("."*(n-7)+"gnn...l")
        x.append("."*(n-7)+"h...kkj")
        x.append("."*(n-7)+"hii...j")
    elif n%6==2:
        for i in range(n//6-1):
            x.append("."*(6*i)+".a.b.c"+"."*(n-6*i-6))
            x.append("."*(6*i)+".a.b.c"+"."*(n-6*i-6))
            x.append("."*(6*i)+"ddg.ll"+"."*(n-6*i-6))
            x.append("."*(6*i)+"e.g.kk"+"."*(n-6*i-6))
            x.append("."*(6*i)+"e.hhj."+"."*(n-6*i-6))
            x.append("."*(6*i)+"ffiij."+"."*(n-6*i-6))
        x.append("."*(n-8)+".a.bb.cc")
        x.append("."*(n-8)+".a...m.j")
        x.append("."*(n-8)+"..pp.m.j")
        x.append("."*(n-8)+"hh..i.o.")
        x.append("."*(n-8)+"gg..i.o.")
        x.append("."*(n-8)+"..n.ll.k")
        x.append("."*(n-8)+"f.n....k")
        x.append("."*(n-8)+"f.dd.ee.")
    elif n%6==4:
        for i in range(n//6):
            x.append("."*(6*i)+".a.b.c"+"."*(n-6*i-6))
            x.append("."*(6*i)+".a.b.c"+"."*(n-6*i-6))
            x.append("."*(6*i)+"ddg.ll"+"."*(n-6*i-6))
            x.append("."*(6*i)+"e.g.kk"+"."*(n-6*i-6))
            x.append("."*(6*i)+"e.hhj."+"."*(n-6*i-6))
            x.append("."*(6*i)+"ffiij."+"."*(n-6*i-6))
        x.append("."*(n-4)+"aacb")
        x.append("."*(n-4)+"ffcb")
        x.append("."*(n-4)+"hgdd")
        x.append("."*(n-4)+"hgee")
    else:
        for i in range(n//6):
            x.append("."*(6*i)+".a.b.c"+"."*(n-6*i-6))
            x.append("."*(6*i)+".a.b.c"+"."*(n-6*i-6))
            x.append("."*(6*i)+"ddg.ll"+"."*(n-6*i-6))
            x.append("."*(6*i)+"e.g.kk"+"."*(n-6*i-6))
            x.append("."*(6*i)+"e.hhj."+"."*(n-6*i-6))
            x.append("."*(6*i)+"ffiij."+"."*(n-6*i-6))
        x.append("."*(n-5)+"aabbc")
        x.append("."*(n-5)+"g.h.c")
        x.append("."*(n-5)+"gjh..")
        x.append("."*(n-5)+"dj.ii")
        x.append("."*(n-5)+"deeff")
    for i in range(n):
        print("".join(x[i]))

Nach D Problem

Ich hatte das Gefühl, dass es immer noch auf einem Niveau ist, das gelöst werden sollte, also würde ich es gerne herausfordern, wenn ich es das nächste Mal mache.

Recommended Posts

AtCoder Grand Contest 041 Bewertung
AtCoder Grand Contest 048 Bewertung
AtCoder Grand Contest 045 Bewertung
AtCoder Grand Contest 044 Bewertung
AtCoder Grand Contest 046 Bewertung
AtCoder Anfängerwettbewerb 152 Rückblick
AtCoder Regular Contest 105 Bewertung
AtCoder Beginner Contest 160 Bewertung
AtCoder Anfängerwettbewerb 178 Bewertung
AtCoder Anfängerwettbewerb 166 Bewertung
AtCoder Anfängerwettbewerb 167 Bewertung
AtCoder Beginner Contest 164 Bewertung
AtCoder Beginner Contest 169 Bewertung
AtCoder Beginner Contest 181 Bewertung
AtCoder Beginner Contest 171 Bewertung
AtCoder Beginner Contest 182 Bewertung
AtCoder Beginner Contest 180 Bewertung
AtCoder Anfängerwettbewerb 177 Rückblick
AtCoder Anfängerwettbewerb 168 Bewertung
AtCoder Beginner Contest 179 Bewertung
AtCoder Beginner Contest 172 Bewertung
AtCoder Regular Contest 106 Bewertung
AtCoder Anfängerwettbewerb 176 Bewertung
AtCoder Anfängerwettbewerb 175 Bewertung
AtCoder Anfängerwettbewerb 174 Bewertung
AtCoder Beginner Contest 153 Bewertung
AtCoder Anfängerwettbewerb 156 Bewertung
AtCoder Beginner Contest 161 Bewertung
AtCoder Beginner Contest 170 Bewertung
AtCoder Regular Contest 104 Bewertung
AtCoder Beginner Contest 165 Bewertung
AtCoder Beginner Contest 173 Bewertung
AtCoder Anfängerwettbewerb 155 Bewertung
AtCoder Beginner Contest 162 Bewertung
AtCoder Grand Contest 041 Teilnahmebericht
AtCoder Grand Contest 040 Teilnahmebericht
AtCoder Grand Contest 047 Teilnahmebericht
AtCoder Grand Contest Past Question Challenge 2
AtCoder Grand Contest Vergangene Frage Herausforderung 1
AtCoder Beginner Contest 066 Überprüfen Sie frühere Fragen
AtCoder Anfängerwettbewerb 177
Yukicoder-Wettbewerb 259 Bewertung
Yukicoder-Wettbewerb 264 Bewertung
AtCoder Anfängerwettbewerb 179
AtCoder Anfängerwettbewerb 172
AtCoder Anfängerwettbewerb 180
Yukicoder-Wettbewerb 261 Bewertung
Yukicoder-Wettbewerb 267 Bewertung
AtCoder Anfängerwettbewerb 173
Yukicoder-Wettbewerb 266 Bewertung
Atcoder Anfänger Wettbewerb 153
Yukicoder-Wettbewerb 263 Bewertung
Yukicoder-Wettbewerb 268 Bewertung
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 062 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