[PYTHON] Educational Codeforces Round 93 Bacha Review (8/17)

Die Ergebnisse dieser Zeit

スクリーンショット 2020-08-17 17.36.36.png

Eindrücke dieser Zeit

Ich habe immer noch das Gefühl, dass der Ort, an dem D nicht passieren kann, nicht stabil ist. Ich blieb beim Versuch stecken, es mit einer nicht angenommenen Lösung zu tun. Selbst wenn Sie versuchen, verrückt zu werden, ** stellen Sie sicher, dass Sie eine gute Perspektive haben, bevor Sie sie implementieren **.

Problem A

Ich habe das Problem fast falsch verstanden. Das Problem besteht darin, einen Satz von drei Zahlen zu beantworten, die kein Dreieck bilden, und da die Folge $ a $ in aufsteigender Reihenfolge sortiert wurde, ist $ a \ _i + a \ _j <a \ _k (i <j <k) $ Stellen Sie sicher, dass es existiert. Dies kann erreicht werden, indem man erwägt, $ a \ _i + a \ _j $ kleiner und $ a \ _k $ größer zu machen. Stellen Sie also sicher, dass $ (i, j, k) = (1,2, n) $ gilt. TU es einfach.

A.py


for _ in range(int(input())):
    n=int(input())
    a=list(map(int,input().split()))
    if a[0]+a[1]<=a[-1]:
        print(f"1 2 {n}")
    else:
        print(-1)

B-Problem

Es schien für einen Moment schwierig, aber es war einfach.

Beide zielen darauf ab, die Anzahl der zu wählenden Einsen zu maximieren, also wechseln Sie sich von der längsten fortlaufenden Unterspalte ab. Daher wird die Länge der fortlaufenden Teilzeichenfolge von 1, die in der Zeichenfolge $ S $ enthalten ist, in "ans" gespeichert und dann in absteigender Reihenfolge der Werte sortiert, und die Summe der ungeraden Reihenfolge ist der Maximalwert von Alices Punktzahl. In Python ist dies sehr praktisch, da Sie mit nur "ans [:: 2]" schreiben können, um zwei zu überspringen.

B.py


for _ in range(int(input())):
    s=input()
    n=len(s)
    ans=[0]
    for i in range(n):
        if s[i]=="1":
            ans[-1]+=1
        else:
            if ans[-1]!=0:
                ans.append(0)
    ans.sort(reverse=True)
    print(sum(ans[::2]))

C-Problem

Ich vermutete DP wegen seiner einfachen Handhabung als Übergang der Addition, aber es ist schwierig **, weil ich den Status nicht verwalten kann ** (als Ergebnis war das D-Problem DP. Ich bin enttäuscht).

Da wir uns mit ** Intervallen befassen, haben wir uns entschlossen, den Unterschied in den kumulierten Summen ** zu berücksichtigen. Daher wird die Summe bis zum $ x $ th als $ S \ _x $ gesetzt. Zu diesem Zeitpunkt ist der Zustand des Subjekts $ S \ _r- S \ _ {l-1} = r-l + 1 \ linker rechter Pfeil S \ _r-r = S \ _ {l-1} - (l-1) $ Ich werde. Wenn also $ S \ _0-0 = 0 $ ist, wird jedes $ i (0 \ leqq i \ leqq n) $ mit demselben $ S \ _i-i $ gepaart. Daher wird dies in diejenigen unterteilt, die mit einem Wörterbuch wie Counter identisch sind, und wenn es $ l $ $ i $ gibt, so dass $ S \ _i-i = k $, $ \ _l C \ _2 $ Ist die Anzahl dieser $ i $ -Kombinationen. Führen Sie diese Berechnung für jedes $ k $ durch, und die Summe ist die Antwort.

AtCoder scheint auch kürzlich herausgekommen zu sein, so dass ich es mit hoher Geschwindigkeit lösen konnte. Wahrscheinlich hat es vor einem Monat ungefähr 30 Minuten gedauert, also spürte ich die Wichtigkeit und das Wachstum der Hingabe.

C.py


for _ in range(int(input())):
    n=int(input())
    a=list(map(int,input().split()))
    if a==[i+1 for i in range(n)]:
        print(0)
        continue
    #Ohne die Kanten
    for i in range(n):
        if a[i]!=i+1:
            break
    for j in range(n-1,-1,-1):
        if a[j]!=j+1:
            break
    #Indexfehler
    for k in range(i,j+1):
        if a[k]==k+1:
            print(2)
            break
    else:
        print(1)

D Problem

** Ich hatte das Gefühl, dass eine Lücke in einer Überlegung einen großen Unterschied macht **. Ich möchte eine genauere Überlegung machen.

Die erste Richtlinie, die Sie leicht finden können, ist **, diejenigen mit den größten Werten gierig zu kombinieren **. Mit anderen Worten, die Paare von $ r-, g- und b $ -Seiten werden in der Reihenfolge der längsten in die Priorität \ _queue verschoben, und die Paare werden aus der längsten gebildet. Wenn diese Methode verwendet wird, bleibt ** nur eine Farbseite übrig . Was soll ich in diesem Fall tun? Die erste Methode besteht darin, die zusätzlichen Seiten nachzurüsten. Da jedoch die Greedy-Methode verwendet wird ( Ich entscheide die Reihenfolge der Auswahl willkürlich **), besteht die Möglichkeit, dass die Greedy-Methode durch ** Nachrüstung ** unterbrochen wird. Ich dachte, ich würde es nicht brechen, aber ich konnte es nicht implementieren, weil ich im Begriff war, auf den Eckfall zu treten. Auf diese Weise ** ist es bis zu einem gewissen Grad schwierig zu denken, und wenn andere Richtlinien festgelegt werden können, sollten Sie eine andere Methode in Betracht ziehen **.

Hier hat die oben erwähnte gierige Methode einen beträchtlichen ** Spielraum für die Ausführungszeit **, so dass Sie daran denken können, ohne sich speziell mit der gierigen Methode zu befassen. Die nächste Methode, an die ich denken kann, ist DP. Zusätzlich zur Berücksichtigung des ** Übergangs der Auswahl ** beträgt $ r, g, b $ höchstens 200, so dass es nur ** Zustände ** von ungefähr $ R \ mal G \ mal B = 8 \ mal 10 ^ 6 $ gibt. Unter diesem Gesichtspunkt scheint DP ein sehr wirksames Mittel zu sein.

Der hier betrachtete DP ist wie folgt. Da es am besten ist, $ r, g und b $ aus den größten auszuwählen, werden wir mit der Diskussion fortfahren, vorausgesetzt, dass sie in absteigender Reihenfolge sortiert sind.

$ dp [i] [j] [k]: = $ ($ i $ Stücke von $ r $, $ j $ Stücke von $ g $, $ k $ Stücke von $ b $, das größte Rechteck Gesamtfläche)

Darüber hinaus werden wir bei einem normalen Übergang erwägen, Elemente einzeln hinzuzufügen. Dieses Mal können wir jedoch ein Rechteck erstellen, indem wir ein Paar bilden. Daher betrachten wir einen Übergang, der ** Paare ** hinzufügt. So sieht es aus:

(1) Wenn $ i <R $ und $ j <G $ Sie können ein Paar aus $ r $ und $ g $ auswählen, wählen Sie also das größte $ r [i] $ und $ g [j] , das Sie auswählen können ( i, j $ sind 0-indiziert). Bitte beachte, dass.). dp[i+1][j+1][k]=max(dp[i+1][j+1][k],dp[i][j][k]+r[i]*g[j])

(2) Wenn $ i <R $ und $ k <B $ Sie können ein Paar aus $ r $ und $ b $ auswählen, wählen Sie also das größte $ r [i] $ und $ b [k] , das Sie auswählen können ( i, k $ sind 0-indiziert). Bitte beachte, dass.). dp[i+1][j][k+1]=max(dp[i+1][j][k+1],dp[i][j][k]+r[i]*b[k])

(3) Wenn $ j <G $ und $ k <B $ Sie können ein Paar aus $ g $ und $ b $ auswählen, wählen Sie also das größte $ g [j] $ und $ b [k] , das Sie auswählen können ( j, k $ sind 0-indiziert). Bitte beachte, dass.). dp[i][j+1][k+1]=max(dp[i][j+1][k+1],dp[i][j][k]+g[j]*b[k])

(4) Zu anderen Zeiten Da es als Gruppe nichts zu wählen gibt, sind die folgenden Antworten. [1] Wenn $ i <R $, ist $ dp [i + 1] [j] [k] = max (dp [i + 1] [j] [k], dp [i] [j] [k] ) $ [2] Wenn $ j <G $, ist $ dp [i] [j + 1] [k] = max (dp [i] [j + 1] [k], dp [i] [j] [k] ) $ [3] Wenn $ k <B $, ist $ dp [i] [j] [k + 1] = max (dp [i] [j] [k + 1], dp [i] [j] [k] ) $

D.cc


//Debug-Optionen:-fsanitize=undefined,address

//Compileroptimierung
#pragma GCC optimize("Ofast")

//Einschließen usw.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

//Makro
//für Schleife
//Das Argument ist(Variablen in der Schleife,Bewegungsumfang)Oder(Variablen in der Schleife,Erste Nummer,Anzahl der Enden)、のどちらOder
//Schleifenvariablen ohne D werden um 1 erhöht, und Schleifenvariablen mit D werden um 1 dekrementiert.
//FORA ist ein Bereich für Aussagen(Wenn es schwer zu bedienen ist, löschen Sie es)
#define REP(i,n) for(ll i=0;i<ll(n);i++)
#define REPD(i,n) for(ll i=n-1;i>=0;i--)
#define FOR(i,a,b) for(ll i=a;i<=ll(b);i++)
#define FORD(i,a,b) for(ll i=a;i>=ll(b);i--)
#define FORA(i,I) for(const auto& i:I)
//x ist ein Container wie ein Vektor
#define ALL(x) x.begin(),x.end() 
#define SIZE(x) ll(x.size()) 
//Konstante
#define INF 1000000000000 //10^12:∞
#define MOD 1000000007 //10^9+7:Gemeinsames Recht
#define MAXR 100000 //10^5:Maximale Reichweite des Arrays
//Abkürzung
#define PB push_back //Einfügen
#define MP make_pair //Paarkonstruktor
#define F first //Das erste Element des Paares
#define S second //Das zweite Element des Paares

signed main(){
    //Code zur Beschleunigung der Eingabe
    //ios::sync_with_stdio(false);
    //cin.tie(nullptr);
    ll R,G,B;cin>>R>>G>>B;
    vector<ll> r(R);REP(i,R)cin>>r[i];sort(ALL(r),greater<ll>());
    vector<ll> g(G);REP(i,G)cin>>g[i];sort(ALL(g),greater<ll>());
    vector<ll> b(B);REP(i,B)cin>>b[i];sort(ALL(b),greater<ll>());
    vector<vector<vector<ll>>> dp(R+1,vector<vector<ll>>(G+1,vector<ll>(B+1,0)));
    REP(i,R+1){
        REP(j,G+1){
            REP(k,B+1){
                //DP für jedes Paar auswählen und verteilen
                //Es ist einfach, wenn Sie daran denken
                //dp[i][j][k]:=Wenn das i-te j-te und das k-te gepaart sind
                bool f=false;
                if(i<R and j<G){
                    dp[i+1][j+1][k]=max(dp[i+1][j+1][k],dp[i][j][k]+r[i]*g[j]);
                    f=true;
                }
                if(i<R and k<B){
                    dp[i+1][j][k+1]=max(dp[i+1][j][k+1],dp[i][j][k]+r[i]*b[k]);
                    f=true;
                }
                if(j<G and k<B){
                    dp[i][j+1][k+1]=max(dp[i][j+1][k+1],dp[i][j][k]+g[j]*b[k]);
                    f=true;
                }
                if(!f){
                    if(i<R)dp[i+1][j][k]=max(dp[i+1][j][k],dp[i][j][k]);
                    if(j<G)dp[i][j+1][k]=max(dp[i][j+1][k],dp[i][j][k]);
                    if(k<B)dp[i][j][k+1]=max(dp[i][j][k+1],dp[i][j][k]);
                }
            }
        }
    }
    cout<<dp[R][G][B]<<endl;
}

Nach dem E-Problem

Ich werde diesmal überspringen

Recommended Posts

Educational Codeforces Round 93 Bacha Review (8/17)
Educational Codeforces Round 94 Bacha Review (9/3)
Educational Codeforces Round 91 Bacha Review (7/28)
Bildungs-Codeforces-Runde 88 Bacha Review (8/4)
Educational Codeforces Round 86 Bacha Review (9/17)
Educational Codeforces Round 89 Bacha Review (9/8)
Educational Codeforces Round 92 Bacha Review (30.07.)
Educational Codeforces Round 90 Bacha Review (8/19)
Codeforces Runde # 658 (Div. 2) Bacha Review (7/29)
Codeforces Round # 654 (Div. 2) Bacha Review (8/18)
Codeforces Round # 594 (Div. 2) Bacha Review (29.10.)
Codeforces Runde # 609 (Div. 2) Bacha Review (10/8)
Codeforces Round # 597 (Div. 2) Bacha Review (27.10.)
Codeforces Runde # 666 (Div. 2) Bacha Review (9/2)
Codeforces Runde # 651 (Div. 2) Bacha Review (8/20)
Codeforces Runde # 659 (Div. 2) Bacha Review (8/5)
Codeforces Runde # 610 (Div. 2) Bacha Review (10/5)
Codeforces Runde # 479 (Div. 3) Bacha Review (9/25)
Codeforces Runde # 603 (Div. 2) Bacha Review (10/15)
Codeforces Runde # 600 (Div. 2) Bacha Review (10/21)
Codeforces Runde # 481 (Div. 3) Bacha Review (9/24)
Codeforces Runde # 639 (Div. 2) Bacha Review (9/4)
Codeforces Runde # 612 (Div. 2) Bacha Review (10/2)
Codeforces Runde # 521 (Div. 3) Bacha Review (10/9)
Codeforces Runde # 652 (Div. 2) Bacha Review (8/24)
Codeforces Runde # 673 (Div. 2) Bacha Review (10/22)
Codeforces Runde # 606 (Div. 3) Bacha Review (10/13)
Codeforces Runde # 613 (Div. 2) Bacha Review (10/1)
Codeforces Round # 665 (Div. 2) Bacha Review (8/23)
Codeforces Runde # 592 (Div. 2) Bacha Review (11/03)
Codeforces Runde # 662 (Div. 2) Bacha Review (8/8)
Codeforces Round # 618 (Div. 2) Bacha Review (9/26)
Codeforces Runde # 648 (Div. 2) Bacha Review (9/5)
Codeforces Runde # 676 (Div. 2) Bacha Review (10/31)
Codeforces Round # 675 (Div. 2) Bacha Review (30.10.)
Codeforces Runde # 486 (Div. 3) Bacha Review (9/23)
Codeforces Round # 671 (Div. 2) Bacha Review (9/22)
Codeforces Runde # 669 (Div. 2) Bacha Review (9/9)
Codeforces Runde # 672 (Div. 2) Bacha Review (10/16)
Codeforces Round # 638 (Div. 2) Bacha Review (9/16)
Codeforces Runde # 663 (Div. 2) Bacha Review (8/13)
Codeforces Runde # 668 (Div. 2) Bacha Review (9/7)
Codeforces Runde # 663 (Div. 2) Bacha Review (8/16)
Codeforces Runde # 609 (Div. 2) Bacha Review (10/6)
Codeforces Round # 645 (Div. 2) Bacha Review (9/10)
Codeforces Runde # 664 (Div. 2) Bacha Review (8/13)
Codeforces Round # 660 (Div. 2) Bacha Review (8/4)
Bildungs-Codeforces-Runde 87
Codeforces Round # 643 (Div. 2) Review
Codeforces Round # 679 (Div. 2) Review (10/25)
Codeforces Round # 657 (Div. 2) Review
Codeforces Beta-Runde # 13
Codeforces Beta Runde 1
Codeforces Beta Runde 2
DP100 Frage Bacha Review 1 ~ 10 (8 / 26,27)
Codeforces Round # 626 B. Unterrechtecke zählen
Codeforces Runde # 609 (Div. 2) (bis B)