【常规DP】P2577 [ZJOI2005]午餐

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 pair<int, int> p[210];
 7 int f[210][40010];
 8 int sum[210];
 9 
10 bool cmp(pair<int, int>a, pair<int, int>b)
11 {
12     return a.second > b.second;
13 }
14 
15 int main()
16 {
17     int n;
18     cin >> n;
19     for (int i = 1; i <= n; i++)
20     {
21         cin >> p[i].first >> p[i].second;
22     }
23     sort(p + 1, p + n + 1, cmp);
24     for (int i = 1; i <= n; i++)
25         sum[i] = sum[i - 1] + p[i].first;
26     memset(f, 0x3f, sizeof(f));
27     f[0][0] = 0;
28     for (int i = 1; i <= n; i++)
29     {
30         //从一个人递推到n个人
31         for (int j = 0; j <= sum[i]; j++)
32         {
33             if (j >= p[i].first) f[i][j] = min(f[i][j], max(f[i - 1][j - p[i].first], j + p[i].second));
34             f[i][j] = min(f[i][j], max(f[i - 1][j], sum[i] - j + p[i].second));
35             //sum[i]表示前i个人打饭的时间和
36             //sum[i]-j=k,k为在2号窗口打饭的时间
37             //f[i][j]表示前i个人在一号窗口打饭的总时间为j时最早吃完的时间
38         }
39     }
40     int mint = 0x3f3f3f3f;
41     for (int i = 0; i <= sum[n]; i++)
42     {
43         mint = min(mint, f[n][i]);
44     }
45     cout << mint;
46 }
View Code

猜你喜欢

转载自www.cnblogs.com/thjkhdf12/p/11641160.html