次元传送门:洛谷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+贪心)的更多相关文章

  1. 洛谷P2577 [ZJOI2005]午餐 dp

    正解:序列dp 解题报告: 传送门! 这题首先要想到一个显然的贪心:每个窗口的排队顺序都是按照吃饭时间从大到小排序的 证明如下: 这种贪心通常都是用微扰法,这题也不例外 现在假如已经确定了每个窗口有哪 ...

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

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

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

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

  4. 洛谷 P2577 [ZJOI2005]午餐 题解

    每日一题 day56 打卡 Analysis 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个 ...

  5. 洛谷 P2577 [ZJOI2005]午餐

    这道题目比较难想. 题解: 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个人,在1号窗口打饭 ...

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

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

  7. 洛谷1417 烹调方案 dp 贪心

    洛谷 1417 dp 传送门 挺有趣的一道dp题目,看上去接近于0/1背包,但是考虑到取每个点时间不同会对最后结果产生影响,因此需要进行预处理 对于物品x和物品y,当时间为p时,先加x后加y的收益为 ...

  8. BZOJ1899或洛谷2577 [ZJOI2005]午餐

    BZOJ原题链接 洛谷原题链接 解决这题得先想到一个贪心:吃饭慢的先排队. 并不会证明(感觉显然 设\(f[i][j][k]\)表示已经排好了前\(i\)人,第一个队伍需要花费的打饭时间为\(j\), ...

  9. 洛谷 2577 [ZJOI2005]午餐——序列dp

    题目:https://www.luogu.org/problemnew/show/P2577 可以从只有一个窗口的角度思考出一个贪心结论.就是应当按吃饭时间(不算打饭时间)从大到小排序.这样交换相邻两 ...

随机推荐

  1. css画一个提示框

    用css画一个如下图的提示框: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  2. PyCharm 自定义模版

    PyCharm 自定义模板 创建一个新的模板: 点击 Preferences... 选项或者按下快捷键 Command(⌘) + , 打开设置对话框. 找到 在 Editor 下的 File and ...

  3. react阻止默认事件

    return false无效  必须 preventDefault

  4. 纯小白入手 vue3.0 CLI - 1 - npm 安装与初始化

    node 开发环境请先自行准备 npm install -g @vue/cli 安装完成之后命令行则存在 vue 命令 vue -V 查看本地 vue 版本 vue -h 输出帮助 vue creat ...

  5. FFmpeg精确时间截取视频

    简介: 之前用到过FFmpeg截取过音频和视频发现,截取的视频文件时间不是很准确,今天便系统的学习了一下FFmpeg截取视频的知识 参考: https://zhuanlan.zhihu.com/p/2 ...

  6. CentOS7.4 + Hadoop2.7.5安装配置管理(伪分布式)

    1.  规划 1.1.  机器列表 NameNode SecondaryNameNode DataNodes 192.168.1.80 192.168.1.80 192.168.1.80 1.2.  ...

  7. AngularJs 第一个自定义指令编写

    公司在做一个OA系统, 包括移动端(从微信企业号进入OA系统),电脑端. 电脑端还是用的传统的easyui做界面,asp.net mvc作为服务端.这个技术已经很成熟了配合权限框架很快就能开发出来.但 ...

  8. Vue 框架-05-动态绑定 css 样式

    Vue 框架-05-动态绑定 css 样式 今天的小实例是关于 Vue 框架动态绑定 css 样式,这也是非常常用的一个部分 首先说一下 动态绑定,相对的大家都知道静态绑定,静态绑定的话,直接加 cl ...

  9. Android 原生 MediaPlayer 和 MediaCodec 的区别和联系(二)

    目录: (3)Android 官方网站 对 MediaPlayer的介绍 正文:  Android 官方网站 对 MediaPlayer的介绍         MediaPlayer      pub ...

  10. spring多线程初探

    6月14号  晴  最高温度37   今天很热的一天啊,开发的任务现在正在测试阶段,手头没有什么工作任务,忙里偷闲,丰富一下我的blog. 前两天有个需求:调用第三方接口,这个接口的响应时间有点长,需 ...