//#pragma GCC target ("avx2")
//#pragma GCC optimize ("Ofast")
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define F first
#define S second
#define pb push_back
const int N = 1e3+100, NN=26, mod=1e9+7;
//int gcd(int a, int b) { if (b == 0) return a; else return gcd(b, a % b); }
//int lcm(int a, int b) { return a / gcd(a, b) * b; }
//int binpow(int a,int b){if(!b)return 1; if(b&1)return a*binpow(a,b-1)%mod; int x=binpow(a,b/2); return x*x%mod;}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, m, k;
cin >> n >> m >> k;
int a[n+1], b[m+1];
int sum=0;
bool b4=0;
multiset < int > st;
for(int i=1;i<=n;i++){
cin >> a[i];
sum+=a[i];
if(a[i]==1) b4=1;
}
for(int i=1;i<=m;i++){ cin >> b[i]; st.insert(b[i]);}
if((k>m)){
cout << "Impossible";
return 0;
}
sort(b+1, b+m+1);
int ans=0;
bool b2=0;
if(k==1 && m==2){
if(b[1]+b[2]-sum<0) cout << "Impossible";
else if(b[1]-sum>=0) cout << b[1]-sum;
else if(b[2]-sum>=0) cout << b[2]-sum;
else cout << b[2]+b[1]-sum;
return 0;
}
if(k==1){
if(b[1]-sum<0) cout << "Impossible";
else cout << b[1]-sum;
return 0;
}
// nmk/64
st.clear();
st.insert(b[1]-n);
st.insert(b[2]-n);
if(*st.begin()<0){
cout << "Impossible";
return 0;
}
for(int i=1;i<=n;i++){
while(a[i]>0){
int g=*st.rbegin(), h=*st.begin();
if(g==0){
b2=1;
break;
}
st.insert(h);
st.insert(g-1);
a[i]--;
}
if(b2==1) break;
}
if(b2==1 || b4==1) cout << "Impossible";
else (*st.rbegin())+(*st.begin());
}
# | 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... |