Submission #1226762

#TimeUsernameProblemLanguageResultExecution timeMemory
1226762nanaseyuzukiKitchen (BOI19_kitchen)C++20
100 / 100
117 ms222536 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define pii pair <int, int>

const int mn = 305, mm = (1 << 20) + 1, inf = 1e18;
int a[mn], f[mn], m, n, k, b[mn];
int dp[mn][mn * mn];

void solve(){
    cin >> n >> m >> k;
    int sum = 0, sum1 = 0, min_val = INT_MAX;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        sum += a[i];
        min_val = min(min_val, a[i]);
    }
    for(int i = 1; i <= m; i++){
        cin >> b[i];
        sum1 += b[i];
    }
    if(m < k || min_val < k || sum1 < sum){
        cout << "Impossible\n";
        return;
    }
    // cout << 1 << '\n';
    fill(&dp[0][0], &dp[0][0] + mn * mn * mn, -inf);
    dp[0][0] = 0;
    for(int i = 1; i <= m; i++){
        for(int j = 0; j <= sum1; j++){
            dp[i][j] = dp[i - 1][j];
            if(j >= b[i]){
                dp[i][j] = max(dp[i][j], dp[i - 1][j - b[i]] + min(n, b[i]));
            }
        }
    }
    int res = INT_MAX;
    for(int j = max(sum, n * k); j <= sum1; j++){
        if(dp[m][j] >= n * k){
            res = j;
            break;
        }
    }
    if(res == INT_MAX) cout << "Impossible\n";
    else cout << res - sum;
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t = 1;
    // cin >> t;
    while(t--) solve();
}
#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...