Submission #746041

#TimeUsernameProblemLanguageResultExecution timeMemory
746041vjudge1Kitchen (BOI19_kitchen)C++17
51 / 100
326 ms108404 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 301;
const int MAXS = MAXN*MAXN+1000;

int dp[MAXN][MAXS], n, m, k;

void solve() {
	vector<int> a(n+1), b(m+1);
	int need = 0;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		need += a[i];
	}
	for (int j = 1; j <= m; j++) {
		cin >> b[j];
	}
	
	int ans = INT_MAX;
	for (int bits = 0; bits < (1 << m); bits++) {
		int x = bits<<1;
		
		int sum = 0, chefs = 0, bad_chefs = 0, good_chefs = 0;
		for (int i = 1; i <= m; i++) {
			if ((x>>i)&1) {
				sum += b[i]; chefs++;
				if (b[i] < n) bad_chefs += b[i];
				else good_chefs++;
			}
		}

		bool good = int(bad_chefs/n) + good_chefs >= k;
		for (int i = 1; i <= n; i++) {
			if (a[i] < k) good = false;
		}
		
		if (good && sum >= need) {
			ans = min(ans, sum-need);
		}

	}
	if (ans == INT_MAX)
		cout << "Impossible\n";
	else
		cout << ans << "\n";
}

int main() {
	ios::sync_with_stdio(0); cin.tie(0);
	cin >> n >> m >> k;
	if (k != 1) {
		solve();
		return 0;
	}
	vector<int> a(n+1), b(m+1);
	int sum = 0;
	for (int i = 1; i <= n; i++) {
		cin >> a[i]; sum += a[i];
	}
	for (int j = 1; j <= m; j++) {
		cin >> b[j];
	}
	
	dp[0][0] = true;
	for (int i = 1; i <= m; i++) {
		for (int j = 0; j < MAXS; j++) {
			dp[i][j] = dp[i-1][j];
		}
		for (int j = b[i]; j < MAXS; j++) {
			if (dp[i-1][j-b[i]]) {
				dp[i][j] = true;
			}
		}
	}
	for (int i = 0; i < MAXS; i++) {
		if (dp[m][i]) cerr << i << " ";
	}
	for (int i = sum; i < MAXS; i++) {
		if (dp[m][i]) {
			cout << i-sum << "\n";
			return 0;
		}
	}
	cout << "Impossible\n";
	return 0;
}
#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...