제출 #530125

#제출 시각아이디문제언어결과실행 시간메모리
530125fatemetmhrKitchen (BOI19_kitchen)C++17
100 / 100
26 ms1112 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

#define pb     push_back
#define fi     first
#define se     second
#define all(x) x.begin(), x.end()

const int maxn5 = 7e3 + 10;
const ll  inf   = 1e18;
const int masum = 1e5 + 10;

ll a[maxn5], b[maxn5];
ll n, m, k;
ll dp[masum];

inline void solve(){
	fill(dp, dp + masum, -inf);
	dp[0] = 0;
	for(int i = 0; i < m; i++){
		for(int j = masum - 1; j >= b[i]; j--){
			dp[j] = max(dp[j], dp[j - b[i]] + min(n, b[i]));
		}
	}
	ll sum = 0;
	for(int i = 0; i < n; i++)
		sum += a[i];
	for(int i = sum; i < masum; i++) if(dp[i] >= n * k){
		cout << i - sum << '\n';
		exit(0);
	}
	cout << "Impossible" << endl;
	exit(0);
}

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

	cin >> n >> m >> k;
	ll sum = 0;
	for(int i = 0; i < n; i++){
		cin >> a[i];
		if(a[i] < k)
			return cout << "Impossible" << endl, 0;
		sum += a[i];
	}
	for(int i = 0; i < m; i++)
		cin >> b[i];
	if(true)
		solve();
	ll ans = inf;
	for(int mask = 0; mask < (1 << m); mask++) if(__builtin_popcount(mask) >= k){
		ll sum1 = 0, sum2 = 0;
		for(int i = 0; i < m; i++) if((mask >> i)&1){
			sum1 += min(n, b[i]);
			sum2 += b[i];
		}
		if(sum1 >= n * k && sum2 >= sum && ans >= sum2){
			ans = sum2;
			//cout << mask << ' ' << sum1 << ' ' << sum2 << endl;
		}
	}
	if(ans == inf)
		cout << "Impossible" << endl;
	else
		cout << ans - sum << endl;
}
















#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...