#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |