洛谷P2577 [ZJOI2005]午餐 dp
正解:序列dp
解题报告:
这题首先要想到一个显然的贪心:每个窗口的排队顺序都是按照吃饭时间从大到小排序的
证明如下:
这种贪心通常都是用微扰法,这题也不例外
现在假如已经确定了每个窗口有哪些人辣,那就是要排除最优顺序使得吃完饭的时间最短
因为两个窗口直接互不影响,所以可以先单独抽出一个窗口来看,就相当于只有一个窗口了
然后选取两个人x,y,设a表示排队时间b表示吃饭时间,令b[x]>b[y]
于是可以列出式子
对于x排在前面,T1=a[x]+max(b[x],a[y]+b[y])
对于y排在前面,T2=a[y]+max(b[y],a[x]+b[x])
因为已经令b[x]>b[y]辣,所以T2=a[y]+a[x]+b[x]
所以T1-T2=max(b[x],a[y]+b[y])-a[y]-b[x]
当b[x]>a[y]+b[y]时,T1-T2=-a[y]<0,T1<T2
当b[x]<a[y]+b[y]时,T1-T2=b[y]-b[x]<0,T1<T2
综上,当x排在前面是T1<T2
所以按照吃饭时间顺序从大到小排是最优的
然后得到了这个贪心之后就变成,已知排队顺序,有两个窗口,求怎么安排时间最小
显然是设f[i][j]:排到第i个人辣一号窗口的排队时间为j的最小吃饭时间
然后记个前缀和sum可以求出二号窗口的排队时间嘛
然后转移就一样是分类讨论走一波就欧克了鸭
还是大概港下QwQ
首先可以到一号窗口,然后到了一号窗口之后有两个情况
第一个是前面的人吃完饭的时间比第i个人的吃饭时间还要长,那就f[i][j+a[i]]=f[i-1][j]
第二个是前面的人吃完饭的时间比第i个人的吃饭时间短一些,那就f[i][j+a[i]]=j+a[i]+b[i]
当然实际上是不用分类讨论的取个max就好QwQ
然后也可以到二号窗口,一样的两个情况一样的思路,懒得详细写辣,反正就max(f[i-1][j],sum[i]-j+a[i]+b[i])
然后放下代码,,,
这个代码是我5个月之前写的辣,,,其实码风差不多,就麻油快读,麻油压行,然后代码里的变量名有点不一样,但思路理顺辣看代码还是比较轻松的辣QwQ所以我就懒得改辣QwQ
over!
#include<bits/stdc++.h>
using namespace std;
][],sum[];
struct str
{
int d,e;
}a[];
bool cmp(str x,str y)
{
return x.e>y.e;
}
int main()
{
cin>>n;
;i<=n;i++)cin>>a[i].d>>a[i].e;
sort(a+,a+n+,cmp);
;i<=n;i++)sum[i]=sum[i-]+a[i].d;
;i<=n;i++)
;j<=sum[n];j++)f[i][j]=;
;
f[][]=;
;i<=n;i++)
;j<=sum[i];j++)
{
][j-a[i].d],j+a[i].e));
f[i][j]=min(f[i][j],max(f[i-][j],sum[i]-j+a[i].e));
}
;j<=sum[n];j++)ans=min(ans,f[n][j]);
cout<<ans;
;
}
洛谷P2577 [ZJOI2005]午餐 dp的更多相关文章
- 洛谷P2577 [ZJOI2005]午餐 打饭时间作为容量DP
P2577 [ZJOI2005]午餐 )逼着自己做DP 题意: 有n个人打饭,每个人都有打饭时间和吃饭时间.有两个打饭窗口,问如何安排可以使得总用时最少. 思路: 1)可以发现吃饭时间最长的要先打饭. ...
- 【题解】洛谷P2577 [ZJOI2005] 午餐(DP+贪心)
次元传送门:洛谷P2577 思路 首先贪心是必须的 我们能感性地理解出吃饭慢的必须先吃饭(结合一下生活) 因此我们可以先按吃饭时间从大到小排序 然后就能自然地想到用f[i][j][k]表示前i个人在第 ...
- [洛谷P2577] [ZJOI2005]午餐
洛谷题目链接:[ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的 ...
- 洛谷 P2577 [ZJOI2005]午餐
这道题目比较难想. 题解: 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个人,在1号窗口打饭 ...
- 洛谷 P2577 [ZJOI2005]午餐 题解
每日一题 day56 打卡 Analysis 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个 ...
- Luogu P2577 [ZJOI2005]午餐(dp)
P2577 [ZJOI2005]午餐 题面 题目描述 上午的训练结束了, \(THU \ ACM\) 小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...
- BZOJ1899或洛谷2577 [ZJOI2005]午餐
BZOJ原题链接 洛谷原题链接 解决这题得先想到一个贪心:吃饭慢的先排队. 并不会证明(感觉显然 设\(f[i][j][k]\)表示已经排好了前\(i\)人,第一个队伍需要花费的打饭时间为\(j\), ...
- 洛谷 2577 [ZJOI2005]午餐——序列dp
题目:https://www.luogu.org/problemnew/show/P2577 可以从只有一个窗口的角度思考出一个贪心结论.就是应当按吃饭时间(不算打饭时间)从大到小排序.这样交换相邻两 ...
- P2577 [ZJOI2005]午餐[DP]
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
随机推荐
- windows命令行下用netsh实现端口转发(端口映射)
微软Windows的netsh是一个命令行脚本实用工具.使用netsh工具 ,可以查看或更改本地计算机或远程计算机的网络配置.不仅可以在本地计算机上运行这些命令,而且可以在网络上的远程计算机上运行. ...
- 用Nginx做静态文件的CDN
这是上个月一次搭建多个静态文件节点的实践,转载自我的博客,欢迎交流. 鉴于监管环境和网站速度之间的矛盾,目前的网络架构方式如下:1.web动态页面(含数据库)架设在位于美国西海岸的数据中心:2.静态文 ...
- mybais 之parameterType ="list"
<!-- 根据货品编号获取商品价格和库存 --> <select id="getGoodsPriceAndStockByGoodsNo" resultMap=&q ...
- GLIBC_2.14报错
[linux]提示"libc.so.6: version `GLIBC_2.14' not found",系统的glibc版本太低 0.以下在系统CentOS 6.3 x86_64 ...
- 微信小程序 禁止ios页面下拉下滑滚动 出现空白的情况
项目需要做了一个图片拖动指定组件上删除,和排序的功能android测试正常, ios会出现拖动图片页面也跟着下滑的尴尬情况. 查文档下拉刷新配置默认是关闭的,后经查找文档发现在本页面page.json ...
- 关于丢失或者损坏/etc/fstab文件后的一些探讨
1.模仿,假设不小心删除了/etc/fstab文件:大家都知道,Linux系统启动的时候会读取该文件来挂载分区,如果缺失该文件,系统一般不能正常启动. 2.采用reboot命令或者alt+ctrl+d ...
- 【转载】.NET中锁6大处理方法 悲观乐观自己掌握
我们为什么需要锁? 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这就会产生冲突,这个就是著名的并发性问题. 图 1 并行性问题漫画 如何解决并发性问题? 借助正确的锁定策略可以解决并发性 ...
- 浅析TCP字节流与UDP数据报的区别
转自http://www.linuxidc.com/Linux/2014-11/109545.htm “TCP是一种流模式的协议,UDP是一种数据报模式的协议”,这句话相信大家对这句话已经耳熟能详~但 ...
- Android设计和开发系列第一篇:Notifications通知(Develop—Training)
Develop篇 Building a Notification PREVIOUSNEXT THIS LESSON TEACHES YOU TO Create a Notification Build ...
- WP8.1学习系列(第十二章)——全景控件Panorama开发指南
2014/6/18 适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1 全景体验是本机 Windows ...