题目大意

  THU ACM小组的吃饭计划是这样的:先把所有的人分成两队,并安排好每队中各人的排列顺序,然后一号队伍到一号窗口去排队打饭,二号队伍到二号窗口去排队打饭。每个人打完饭后立刻开始吃,所有人都吃完饭后立刻集合去六教地下室进行下午的训练。现在给定了每个人的打饭时间和吃饭时间,要求安排一种最佳的分队和排队方案使得所有人都吃完饭的时间尽量早。

题解

  我们的思路是从简单到复杂。

如果每个队伍里人的编号都是递增的呢?

  这样我们很容易想到动规。$f(i,j)$表示到了第$i$个人打完饭后第一个队伍已经排队排了$j$分钟时最晚吃完饭的时间最早时多少。递归式为$f(i,j)=\min\{\max\{f(i-1,j-A_i),j+B_i\}, \max\{f(i-1,j),(\sum_{k=1}^i A_k)-j+B_i\}\}$。这么做满足最优子结构,因为看递归式,即使$f(i-1,\cdots)$再怎么小,它也不会对答案$f(i,\cdots)$造成坏的影响。

如果只有一个队伍呢?

  凭生活经验我们显然可以让吃饭时间长的先打饭,否则你能想出别的招吗?


  综上所述,先排序,后DP即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int MAX_PERSON = 250, MAX_A = 250, INF = 0x3f3f3f3f;
int F[MAX_PERSON][MAX_PERSON * MAX_A]; struct Person
{
int A, B; bool operator < (const Person& a) const
{
return B > a.B;
}
}_persons[MAX_PERSON];
int TotPerson; int DP()
{
memset(F, INF, sizeof(F));
F[0][0] = 0;
int sumA = 0;
for (int i = 1; i <= TotPerson; i++)
{
sumA += _persons[i].A;
for (int j = 0; j <= sumA; j++)
{
int left = j >= _persons[i].A ? max(F[i - 1][j - _persons[i].A], j + _persons[i].B) : INF;
int right = max(F[i - 1][j], sumA - j + _persons[i].B);
F[i][j] = min(left, right);
}
}
int ans = INF;
for (int i = 1; i <= sumA; i++)
ans = min(ans, F[TotPerson][i]);
return ans;
} int main()
{
scanf("%d", &TotPerson);
for (int i = 1; i <= TotPerson; i++)
scanf("%d%d", &_persons[i].A, &_persons[i].B);
sort(_persons + 1, _persons + TotPerson + 1);
printf("%d\n", DP());
return 0;
}

  

luogu2577 [ZJOI2005] 午餐 贪心的更多相关文章

  1. Luogu2577 | [ZJOI2005]午餐 (贪心+DP)

    题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他 ...

  2. [ZJOI2005]午餐 (贪心,动态规划)

    题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...

  3. luogu2577/bzoj1899 午餐 (贪心+dp)

    首先,应该尽量让吃饭慢的排在前面,先按这个排个序 然后再来决定每个人到底去哪边 设f[i][j]是做到了第i个人,然后1号窗口目前的总排队时间是j,目前的最大总时间 有这个i和j的话,再预处理出前i个 ...

  4. luogu2577 [ZJOI2005]午餐

    dp[i]表示第一队打饭时间i的最优解 #include <algorithm> #include <iostream> #include <cstring> #i ...

  5. luogu 2577 [ZJOI2005]午餐 贪心+dp

    发现让 $b$ 更大的越靠前越优,然后依次决策将每个人分给哪个窗口. 令 $f[i][j]$ 表示考虑了前 $i$ 个人,且第一个窗口的总等待时间为 $j$ 的最小总时间. 然后转移一下就好了~ #i ...

  6. [ZJOI2005]午餐 (DP)

    [ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口 ...

  7. Luogu P2577 [ZJOI2005]午餐(dp)

    P2577 [ZJOI2005]午餐 题面 题目描述 上午的训练结束了, \(THU \ ACM\) 小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...

  8. [洛谷P2577] [ZJOI2005]午餐

    洛谷题目链接:[ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的 ...

  9. 洛谷P2577 [ZJOI2005]午餐 打饭时间作为容量DP

    P2577 [ZJOI2005]午餐 )逼着自己做DP 题意: 有n个人打饭,每个人都有打饭时间和吃饭时间.有两个打饭窗口,问如何安排可以使得总用时最少. 思路: 1)可以发现吃饭时间最长的要先打饭. ...

随机推荐

  1. 正则表达式 \D 元字符

    \D元字符可以匹配非数字字符,等价于"[^0-9]". 语法结构: (1).构造函数方式: new RegExp("\\D") (2).对象直接量方式: /\D ...

  2. jquery 零碎笔记

    toggle使用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  3. Git 学习笔记(W,I,P)

    /*********************** 个人知识水平有限 有任何错误请尽情指出!!谢谢啦 我的Github 求粉 ミ ゚Д゚彡 ***********************/ 参考教程:廖 ...

  4. mysql存储过程之遍历多表记录后插入第三方表中

    自从学过存储过程后,就再也没有碰过存储过程,这是毕业后写的第一个存储过程. 因为项目里设备的种类比较多,分别存在不同的数据表中,java中对应不同的java bean对象,想要统一管理有点困难.最近正 ...

  5. 郁闷的出纳员 题解(Splay)

    题面 看似是要区间修改,然而实际上只需要维护底线和工资的相对大小关系, 瞬间变水 用delta记录对工资的加减,那么添加节点时点权应-delta,输出时+delta 几种操作中减少工资较麻烦: 1.d ...

  6. .net core里用ZXing生成二维码

    先获取Nuget包 static void Main(string[] args) { string content = "二维码信息"; BitMatrix byteMatrix ...

  7. css3部分注意事项

    CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算? CSS3新增伪类有那些? 1.选择器 id选择器( # myid) 类选择器(.myclassname) 标签选择器(div, h1, p ...

  8. 49.ardinality算法之优化内存开销以及HLL算法

    主要知识点 precision_threshold参数的理解 HLL算法优化(hash)         cardinality,count(distinct),5%的错误率,性能在100ms左右   ...

  9. 3.filter原理(bitset机制与caching机制)

    主要知识点: 一次filter执行顺序 filter和query的特点     一.一次filter执行顺序     1.在倒排索引中查找搜索串,获取document list 以一下date数据来举 ...

  10. from __future__ import absolute_import的作用

    关于这句from future import absolute_import的作用: 直观地看就是说"加入绝对引入这个新特性".说到绝对引入,当然就会想到相对引入.那么什么是相对引 ...