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

Benötigte Zeit

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

Impressionen

Die erste gelbe Frage wurde innerhalb der Zeit erledigt! !! Es ist einfach und es geht um Blau, aber ich bin glücklich! Ich möchte härter arbeiten und das Problem stabil lösen können, bis es gelb ist.

Problem A

Ich habe die Eingabe nicht aufgeteilt, weil sie problematisch war.

answerA.py


s=input()
print("H" if s=="H H" or s=="D D" else "D")

B-Problem

Überlegen Sie, welcher Abschnitt sich auf der rechten Seite befindet (in der zweidimensionalen Ebene).

answerB.py


w,a,b=map(int,input().split())
if a<=b<=a+w or a<=b+w<=a+w:
    print(0)
elif b>a+w:
    print(b-a-w)
else:
    print(a-b-w)

C-Problem

** Ich konnte es ohne Beweis bestehen. ** Ich denke, es ist ein Beweis dafür, dass die Macht zunimmt. Zunächst möchten wir so schnell wie möglich erreichen. Berücksichtigen Sie daher die maximal erreichbaren Koordinaten zum Zeitpunkt $ t $. Dann können Sie leicht sehen, dass es $ 1 + 2 +… + t = t \ times (t + 1) \ div 2 $ wird. Außerdem können Sie zum Zeitpunkt $ t-1 $ $ (t-1) \ mal t \ div 2 $ erreichen, also zum Zeitpunkt $ t $ $ (t-1) \ mal t \ div 2 + 1 $ Wenn Sie zeigen können, dass Sie alle Koordinaten von ~ $ t \ times (t + 1) \ div 2 $ (✳︎) erreichen können, berechnen Sie $ t \ times (t + 1) \ div 2 $ in der Reihenfolge ab Zeitpunkt 1. Sie können sehen, dass die Zeit, die benötigt wird, um ein bestimmtes x zu überschreiten, der zu berechnende Mindestwert ist. Wenn Sie hier die Aktion auswählen, zu keinem Zeitpunkt k etwas zu tun, erreichen Sie die Koordinaten von $ t \ times (t + 1) \ div 2-k $ und indem Sie k = t-1 → 1 bewegen. Da $ (t-1) \ mal t \ div 2 +1 $ → $ t \ mal (t + 1) \ div 2-1 $ alle dargestellt werden können, wird (✳︎) angezeigt.

answerC.py


x=int(input())
for i in range(1,10**5):
    if x<=(i*(i+1))//2:
        print(i)
        break

D Problem

Wie erwartet war das gelbe Problem schwierig, aber ich konnte eine vollständige Antwort erhalten.

Als ich mit der Stichprobe experimentierte, bemerkte ich zunächst, dass die Anzahl der Karten kleiner als ** unnötig zu sein scheint **, also habe ich sie vorerst sortiert und das i-te Element ist unnötig. Ich fragte mich, ob es einen gab. Achten Sie auch auf den Fall, dass Karte i nicht unnötig ist, ** wenn Karte i ein guter Satz wird, wenn sie zu einem schlechten Satz hinzugefügt wird ** (wenn es überhaupt eine Möglichkeit gibt, einen solchen schlechten Satz auszuwählen), Mir wurde auch klar, dass es nicht unnötig war. (← Diese Paraphrase scheint die schwierigste zu sein ... Ich habe jedoch das Gefühl, dass ich oft die Idee verwende, dass das Gegenteil von ** hinzugefügt wird **.) Hier habe ich versucht, ein Muster zu finden, das ein guter Satz wäre, wenn ich Karte i zu einem schlechten Satz hinzufügte, aber es hat nicht funktioniert. Warum nicht hier die Richtlinie wechseln und über alle Zahlenmuster nachdenken, die mit Ausnahme von Karte i durch Karten dargestellt werden können? Ich dachte. Dann können Sie DP verwenden. Mit anderen Worten, wenn Sie das Gesamtmuster der von DP auf die Karte geschriebenen Zahlen aufzeichnen und die auf die Karte i geschriebenen Zahlen hinzufügen können, um eine Zahl zu erstellen, die k überschreitet, ist diese Karte i nicht erforderlich. Es kann beurteilt werden, dass es keine ** gibt. Wenn umgekehrt die Summe der auf die Karte geschriebenen Zahlen kleiner als k ist, aber der Maximalwert (beachten Sie, dass ** 0 enthalten ist **) und die Summe der auf die Karte geschriebenen Zahlen i k nicht überschreitet, die Karte Ich werde nicht mehr gebraucht. Wenn Sie ein Muster finden möchten, das zu einem guten Satz wird, wenn Sie Karte i zu einem schlechten Satz hinzufügen, ist dies der Berechnungsbetrag von O ($ nk ). Wenn Sie jedoch in der Reihenfolge prüfen, ob Karte i nicht erforderlich ist, ist O ( n ^) Es wird 2k $ sein) und wird nicht innerhalb des Zeitlimits enden. Wenn Sie jedoch die Monotonie ausnutzen, dass "wenn Karte i nicht erforderlich ist, ist auch Karte j (j <= i) mit einer kleineren Zahl nicht erforderlich", kann eine Dichotomie verwendet werden, und O ($ nk ) Da $ nk \ log {n} $ ungefähr $ 10 ^ 8 $ in der Berechnungsmenge von log {n} $) beträgt, können Sie ein Programm schreiben, das gerade noch rechtzeitig ist. Außerdem war die Schätzung des Rechenaufwands lose (ich dachte, es wären ungefähr 10 ^ 7 ), und ich gab sie in Python heraus und gab TLE heraus. Es scheint auch, dass der Gesamtbetrag der Berechnung auf O ( nk $) reduziert werden kann, und ich denke, dass es rechtzeitig sein wird, wenn er selbst in Python auf dieses Niveau reduziert wird. Abgesehen davon habe ich vergessen, dass ** das Array nicht sortiert ist, obwohl es eine Dichotomie ist **, ** das Element immer benötigt wird, wenn die auf die Karte geschriebene Zahl k oder mehr ist ** und so weiter. Seien Sie vorsichtig, denn Sie können nichts tun, wenn ein solcher ** grundlegender Algorithmus falsch ist **.

answerD_TLE.py


n,k=map(int,input().split())
a=[int(i) for i in input().split()]
a.sort()

def check(d):#Brauchst du es
    global a,n,k
    dp=[0]*(k)#k-Bis zu 1
    if a[d]>=k:
        return True
    for i in range(n):
        if i!=d:
            dp_sub=[0]*(k)
            for j in range(k-1):
                if j==0 or dp[j]!=0:
                    if j+a[i]<k:
                        dp_sub[j+a[i]]=1
                    else:
                        break
            for j in range(k):
                if dp_sub[j]==1:
                    dp[j]=1
                    if j+a[d]>=k:
                        return True
    return False
l,r=0,n-1
while l+1<r:
    d=(l+r)//2
    if check(d):#Ist es nötig
        r=d
    else:
        l=d
if check(l):
    print(l)
else:
    if check(r):
        print(r)
    else:
        print(r+1)

answerD.cc


#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>

using namespace std;
typedef long long ll;
ll n,k;
vector<ll> a;

bool check(ll d){
    vector<ll> dp(k,0);
    if(a[d]>=k) return  true;
    for(ll i=0;i<n;i++){
        if(i!=d){
            vector<ll> dp_sub(k,0);
            for(ll j=0;j<k-1;j++){
                if(j==0 or dp[j]!=0){
                    if(j+a[i]<k){
                        dp_sub[j+a[i]]=1;
                    }else{
                        break;
                    }
                }
            }
            for(ll j=0;j<k;j++){
                if(dp_sub[j]==1){
                    dp[j]=1;
                    if(j+a[d]>=k) return true;
                }
            }
        }
    }
    return false;
}

signed main(){
    cin >> n >> k;
    a.resize(n);
    for(ll i=0;i<n;i++){cin >> a[i];}
    sort(a.begin(),a.end());
    ll l=0;ll r=n-1;
    while(l+1<r){
        ll d=floor(l+r)/2;
        if(check(d)){
            r=d;
        }else{
            l=d;
        }
    }
    if(check(l)){
        cout << l << endl;
    }else if(check(r)){
        cout << r << endl;
    }else{
        cout << r+1 << endl;
    }
}

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 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
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 112 Rückblick auf frühere Fragen
AtCoder Beginner Contest 076 Rückblick auf frühere Fragen
AtCoder Beginner Contest 089 Rückblick auf frühere Fragen
AtCoder Beginner Contest 069 Rückblick auf frühere Fragen
AtCoder Beginner Contest 079 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 123 Überprüfung früherer Fragen
AtCoder Beginner Contest 049 Rückblick auf frühere Fragen
AtCoder Beginner Contest 078 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