洛谷 [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  阅读(...)  评论(...编辑  收藏