【题解】洛谷P2577 [ZJOI2005] 午餐(DP+贪心)
次元传送门:洛谷P2577
思路
首先贪心是必须的
我们能感性地理解出吃饭慢的必须先吃饭(结合一下生活)
因此我们可以先按吃饭时间从大到小排序
然后就能自然地想到用f[i][j][k]表示前i个人在第一个窗口排队用了j时间 在第二个窗口排队用了k时间
然后就自然地炸空间了
所以我们要降维
因为我们可以由第一个窗口推出第二个窗口所用时间 所以我们可以改原来的数组为:
f[i][j]表示前i个人 在第一个窗口用了j时间 得到的所有前i个人吃完饭的最短时间
如何用第一个窗口推出第二个窗口呢?
显而易见 第一个窗口排队用了j时间+第二个窗口排队用了k时间为前i个人排队用的总时间
那么我们可以用前缀和维护一个总时间sum[i]表示前i个人用的总时间
那么k=sum[i]-j 解决
状态转移方程:
f[i][j]=min(f[i][j],max(f[i-][j-p[i].a],j+p[i].b));//第i个人在第一窗口
//f[i-1][j-p[i].a]表示第i个人排队+吃饭的时间比第i-1个人短 所以不影响
//j+p[i].b即有影响 前i个人排队时间+第i个人吃饭时间
f[i][j]=min(f[i][j],max(f[i-][j],sum[i]-j+p[i].b));//第i个人在第二窗口
//同理 sum[i]-j=k即第二个窗口排队总时间
代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 220
#define INF 1e9+7
struct P
{
int a;
int b;
}p[maxn];
int n;
int sum[maxn];
int f[maxn][maxn*maxn];
bool cmp(P a,P b)
{
return a.b>b.b;
}
int main()
{
memset(f,0x3f,sizeof(f));
cin>>n;
for(int i=;i<=n;i++) cin>>p[i].a>>p[i].b;
sort(p+,p++n,cmp);//排序
for(int i=;i<=n;i++) sum[i]=sum[i-]+p[i].a;//前缀和
f[][]=;//初始化
for(int i=;i<=n;i++)//枚举第几个人
for(int j=;j<=sum[i];j++)//枚举排队时间
{
if(j>=p[i].a) f[i][j]=min(f[i][j],max(f[i-][j-p[i].a],j+p[i].b));
f[i][j]=min(f[i][j],max(f[i-][j],sum[i]-j+p[i].b));
}
int ans=INF;
for(int i=;i<=sum[n];i++)//查询时间
ans=min(ans,f[n][i]);
cout<<ans;
}
【题解】洛谷P2577 [ZJOI2005] 午餐(DP+贪心)的更多相关文章
- 洛谷P2577 [ZJOI2005]午餐 dp
正解:序列dp 解题报告: 传送门! 这题首先要想到一个显然的贪心:每个窗口的排队顺序都是按照吃饭时间从大到小排序的 证明如下: 这种贪心通常都是用微扰法,这题也不例外 现在假如已经确定了每个窗口有哪 ...
- 洛谷P2577 [ZJOI2005]午餐 打饭时间作为容量DP
P2577 [ZJOI2005]午餐 )逼着自己做DP 题意: 有n个人打饭,每个人都有打饭时间和吃饭时间.有两个打饭窗口,问如何安排可以使得总用时最少. 思路: 1)可以发现吃饭时间最长的要先打饭. ...
- [洛谷P2577] [ZJOI2005]午餐
洛谷题目链接:[ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的 ...
- 洛谷 P2577 [ZJOI2005]午餐 题解
每日一题 day56 打卡 Analysis 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个 ...
- 洛谷 P2577 [ZJOI2005]午餐
这道题目比较难想. 题解: 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个人,在1号窗口打饭 ...
- Luogu P2577 [ZJOI2005]午餐(dp)
P2577 [ZJOI2005]午餐 题面 题目描述 上午的训练结束了, \(THU \ ACM\) 小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...
- 洛谷1417 烹调方案 dp 贪心
洛谷 1417 dp 传送门 挺有趣的一道dp题目,看上去接近于0/1背包,但是考虑到取每个点时间不同会对最后结果产生影响,因此需要进行预处理 对于物品x和物品y,当时间为p时,先加x后加y的收益为 ...
- BZOJ1899或洛谷2577 [ZJOI2005]午餐
BZOJ原题链接 洛谷原题链接 解决这题得先想到一个贪心:吃饭慢的先排队. 并不会证明(感觉显然 设\(f[i][j][k]\)表示已经排好了前\(i\)人,第一个队伍需要花费的打饭时间为\(j\), ...
- 洛谷 2577 [ZJOI2005]午餐——序列dp
题目:https://www.luogu.org/problemnew/show/P2577 可以从只有一个窗口的角度思考出一个贪心结论.就是应当按吃饭时间(不算打饭时间)从大到小排序.这样交换相邻两 ...
随机推荐
- NOIP2017 题解
QAQ--由于没报上名并没能亲自去,自己切一切题聊以慰藉吧-- 可能等到省选的时候我就没有能力再不看题解自己切省选题了--辣鸡HZ毁我青春 D1T1 小凯的疑惑 地球人都会做,懒得写题解了-- D1T ...
- .NET Core 微服务架构-Docker部署
本文主要介绍通过Docker来部署通过.NET Core开发的微服务架构,部署的微服务主要包括统一网关(使用Ocelot开发).统一认证(IdentityServer4).应用服务(ASP.NET C ...
- c++之stringstream类的用法
简介: 今天利用opecv提取每一帧图片并保存到本地指定目录下的时,对于保存的每一帧的图片希望第几帧体现在图片名中, 这里便用到了stringstream类的将数字转化为字符串这一功能 C++ Str ...
- Java集合 -- HashSet 和 HashMap
HashSet 集合 HashMap 集合 HashSet集合 1.1 Set 接口的特点 Set体系的集合: A:存入集合的顺序和取出集合的顺序不一致 B:没有索引 C:存入集合的元素没有重复 1. ...
- Sink Prosessor - Flume的可靠性保证:故障转移、负载均衡
Flume的一些组件(如Spooling Directory Source.File Channel)能够保证agent挂掉后不丢失数据. 1.负载均衡 1)Load balancing Sink P ...
- 深入理解net core中的依赖注入、Singleton、Scoped、Transient(四)
相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...
- CSS 引入方式 选择器
---恢复内容开始--- CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. 步骤: A.找到标签 B.操作标签 ...
- Linux安装Tomcat服务器发布项目教程
前面小Alan跟大家聊了在Linux服务器上jdk运行环境的安装以及redis非关系型数据库的安装,今天继续跟大家聊聊Tomcat的安装,以及将我们的项目发布上去并成功的访问. 第一步:将tomcat ...
- 回归JavaScript基础(二)
主题:在HTML中使用JavaScript. 要想把JavaScript放到网页中,就必须涉及到Web的核心语言HTML.向HTML页面中插入JavaScript的主要方法,就是使用<scrip ...
- System.Web.Optimization对脚本和样式表的操作
这个也是本章重点向描述的部分,首先我们可以使用VS2012RC来新建一个MVC4.0项目,版本可以为4.0或4.5.在Global.asax文件代码中,我们发现已经把过滤器,路由器,以及对样式表和脚本 ...