제출 #1199314

#제출 시각아이디문제언어결과실행 시간메모리
1199314dejameiniciarKitchen (BOI19_kitchen)C++20
50 / 100
132 ms8392 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
    ll n,m,k,s=0;
    cin>>n>>m>>k;
    if(k==1){
        vector<ll> V;
    for(ll i=0;i<n;i++){
        ll a;
        cin>>a;
        s+=a;
    }
    for(ll i=0;i<m;i++){
        ll a;
        cin>>a;
        V.push_back(a);
    }
    vector<ll> L(900001,0);
    L[0]=1;
    for(auto x:V){
        for(ll i=900000;i>=0;i--){
            if(L[i]==1){
                if(i+x<900001){
                    L[i+x]=1;
                }
            }
        }
    }
    ll ans=-1;
    for(ll i=s;i<900000;i++){
        if(L[i]==1){
            ans=i-s;
            break;
        }
    }
    if(ans==-1){
        cout<<"Impossible";
    }else{
        cout<<ans;
    }
    return 0;
    }
    vector<ll> V,L,dp1;
    vector<unordered_set<ll>> dp2;
    dp1.assign(90000,0);
    dp2.resize(90000);
    dp1[0]=1;
    dp2[0].insert(0);
    ll caja1=n*k;
    ll caja2=0;
    for(ll i=0;i<n;i++){
        ll a;
        cin>>a;
        if(a>=k){
            caja2+=a-k;
        }else{
            cout<<"Impossible";
            return 0;
        }
        L.push_back(a);
    }
    for(ll i=0;i<m;i++){
        ll a;
        cin>>a;
        V.push_back(a);
    }
    ll a,b,c;
    for(ll i=0;i<m;i++){
        for(ll j=90000;j>=0;j--){
            if(dp1[j]==1){
                b=caja1-j;
                if(V[i]>n){
                    a=n;
                    c=V[i]-n;
                }else{
                    a=V[i];
                    c=0;
                }
                if(a<=b){
                    dp1[j+a]=1;
                    for(auto x:dp2[j]){
                        dp2[j+a].insert(x+c);
                    }
                }else{
                    dp1[j+b]=1;
                    c+=a-b;
                    for(auto x:dp2[j]){
                        dp2[j+b].insert(x+c);
                    }
                }
            }
        }
    }
    ll ans=1000000000;
    for(auto x:dp2[n*k]){
        if(x<ans && x>=caja2){
            ans=x;
        }
    }
    if(ans!=1000000000){
        cout<<ans-caja2;
    }else{
        cout<<"Impossible";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...