Submission #1131498

#TimeUsernameProblemLanguageResultExecution timeMemory
1131498SofiatpcKitchen (BOI19_kitchen)C++20
29 / 100
209 ms1356 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAX = 305, INF = 1e9;
int a[MAX], s[MAX], b[MAX], aa[MAX], dp[2][MAX][MAX], n,m,k;

void solve(){
    for(int i = 1; i <= n; i++)s[i] = s[i-1]+a[i];

    for(int i = 1; i <= n; i++)
        for(int v = 1; v <= 300; v++)dp[(m+1)%2][i][v] = INF;

    for(int x = m; x >= 1; x--){
        int j = x%2, nxt = (x+1)%2;
        for(int i = 1; i <= n; i++)
            for(int v = 1; v <= 300; v++){
                dp[j][i][v] = dp[nxt][i][v];

                int id = upper_bound(s+1,s+2+n, b[x] + s[i] - v)-s;

                if(id > n)dp[j][i][v] = min(dp[j][i][v], b[x] - (s[n]-s[i]) - v );
                else dp[j][i][v] = min(dp[j][i][v], dp[nxt][id][a[id] - (b[x] - (s[id-1]-s[i]) - v)] );
            }
    }

    if(dp[1][1][a[1]] == INF)cout<<"Impossible\n";
    else cout<<dp[1][1][a[1]]<<"\n";
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    cin>>n>>m>>k;

    for(int i = 1; i <= n; i++)cin>>a[i];

    for(int i = 1; i <= m; i++)cin>>b[i];

    if(k == 1){solve(); return 0; }

    int sa = 0;
    for(int i = 1; i <= n; i++){
        sa += a[i]-k;
        if(a[i] < k){cout<<"Impossible\n"; return 0;}
    }
    
    int resp = INF;
    for(int mask = 1; mask < (1<<m); mask++){
        for(int i = 1; i <= n; i++)aa[i] = k;

        int r = 0;
        for(int j = 0; j < m; j++)
            if(mask & (1<<j)){
                int bb = b[j+1];

                for(int i = 1; i <= n; i++)
                    if(aa[i] > 0){
                        aa[i]--;
                        bb--;
                        if(bb == 0)break;
                    }

                r += bb;
            }

        for(int i = 1; i <= n; i++)
            if(aa[i] > 0)r = -1;

        if(r >= sa)resp = min(resp,r-sa);
    }

    if(resp == INF)cout<<"Impossible\n";
    else cout<<resp<<"\n";
}
#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...