洛谷 [P2577] 午餐

DP + 贪心

我们发现,如果只有一个窗口,贪心即可解决,吃饭时间长的人一定要先打饭
有两个窗口的时候,这条性质依然满足,但是两个窗口如何分配,需要 01 背包

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int MAXN = 205;
int dp[MAXN][MAXN * MAXN], n;
struct THU{
	int a, b;
	bool operator < (const THU& t) const {
		return b > t.b;
	}
}num[MAXN];
int sum[MAXN];
int main() {
	cin >> n;
	for(int i = 1; i <= n; i++) {
		cin >> num[i].a >> num[i].b;
	}
	sort(num + 1, num + n + 1);
	sum[1] = num[1].a;
	for(int i = 2; i <= n; i++) {
		sum[i] = sum[i - 1] + num[i].a;
	}
	memset(dp, 0x3f, sizeof(dp));
	dp[0][0] = 0;
	for(int i = 1; i <= n; i++) {
		for(int j = 0; j <= sum[i]; j++) {
			if(j >= num[i].a) 
				dp[i][j] = min(dp[i][j], max(dp[i - 1][j - num[i].a], j + num[i].b));
			dp[i][j] = min(dp[i][j], max(dp[i - 1][j], sum[i] - j + num[i].b));
		}
	}
	int ans = 0x3f3f3f3f;
	for(int i = 0; i <= sum[n]; i++) {
		ans = min(ans, dp[n][i]);
	}
	cout << ans << endl;
	return 0;
}
posted @ 2018-05-22 14:28  Mr_Wolfram  阅读(156)  评论(0编辑  收藏  举报