Submission #1191325

#TimeUsernameProblemLanguageResultExecution timeMemory
1191325AlgorithmWarriorKitchen (BOI19_kitchen)C++20
100 / 100
205 ms114772 KiB
#include <bits/stdc++.h>

using namespace std;

int const INF=1e9;
int const MAX=305;
bitset<MAX*MAX>dp1[MAX];
bitset<MAX*MAX>dp2[MAX];
int n,m,k;
int a[MAX],b[MAX];
int summin[MAX][MAX*MAX];
int cnt1,cnt2;
int sum1,sum2;

void add(bitset<MAX*MAX>dp[],int val,int cap){
    int i;
    for(i=cap;i;--i)
        dp[i]|=(dp[i-1]<<val);
}

void read(){
    cin>>n>>m>>k;
    int i;
    for(i=1;i<=n;++i)
        cin>>a[i];
    for(i=1;i<=m;++i)
        cin>>b[i];
}

bool check(){
    if(m<k)
        return 0;
    int i;
    for(i=1;i<=n;++i){
        if(a[i]<k)
            return 0;
        sum1+=a[i];
    }
    int c1=0,c2=0,s2=0;
    for(i=1;i<=m;++i){
        sum2+=b[i];
        if(b[i]>=n)
            ++c1;
        else{
            ++c2;
            s2+=b[i];
        }
    }
    if(c1<k && s2<(k-c1)*n)
        return 0;
    if(sum1>sum2)
        return 0;
    return 1;
}

void create_knapsacks(){
    dp1[0][0]=1;
    dp2[0][0]=1;
    int i;
    for(i=1;i<=m;++i)
        if(b[i]>=n){
            ++cnt1;
            add(dp1,b[i],cnt1);
        }
        else{
            ++cnt2;
            add(dp2,b[i],cnt2);
        }
}

void create_summin(){
    int i,j;
    for(i=MAX-1;i>=0;--i)
        for(j=MAX*MAX-1;j>=0;--j){
            if(i==MAX-1 || j==MAX*MAX-1){
                summin[i][j]=INF;
                continue;
            }
            if(dp2[i][j])
                summin[i][j]=j;
            else
                summin[i][j]=min(summin[i+1][j],summin[i][j+1]);
        }
}

void minself(int& x,int val){
    if(x>val)
        x=val;
}

int solve(){
    int ans=INF;
    int i,j;
    for(i=0;i<=cnt1;++i)
        for(j=0;j<=sum2;++j)
            if(dp1[i][j]){
                int nrc=max(0,k-i);
                int sum=max(0,max(sum1-j,(k-i)*n));
                minself(ans,j+summin[nrc][sum]-sum1);
            }
    return ans;
}

int main()
{
    read();
    if(!check()){
        cout<<"Impossible";
        return 0;
    }
    create_knapsacks();
    create_summin();
    cout<<solve();
    return 0;
}
#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...