Luogu P2577 [ZJOI2005]午餐(dp)
题面
题目描述
上午的训练结束了, \(THU \ ACM\) 小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂。这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭。由于每个人的口味(以及胃口)不同,所以他们要吃的菜各有不同,打饭所要花费的时间是因人而异的。另外每个人吃饭的速度也不尽相同,所以吃饭花费的时间也是可能有所不同的。
\(THU \ ACM\) 小组的吃饭计划是这样的:先把所有的人分成两队,并安排好每队中各人的排列顺序,然后一号队伍到一号窗口去排队打饭,二号队伍到二号窗口去排队打饭。每个人打完饭后立刻开始吃,所有人都吃完饭后立刻集合去六教地下室进行下午的训练。
现在给定了每个人的打饭时间和吃饭时间,要求安排一种最佳的分队和排队方案使得所有人都吃完饭的时间尽量早。
假设 \(THU \ ACM\) 小组在时刻 \(0\) 到达十食堂,而且食堂里面没有其他吃饭的同学(只有打饭的师傅)。每个人必须而且只能被分在一个队伍里。两个窗口是并行操作互不影响的,而且每个人打饭的时间是和窗口无关的,打完饭之后立刻就开始吃饭,中间没有延迟。
现在给定 \(N\) 个人各自的打饭时间和吃饭时间,要求输出最佳方案下所有人吃完饭的时刻。
输入输出格式
输入格式:
第一行一个整数 \(N\) ,代表总共有 \(N\) 个人。
以下 \(N\) 行,每行两个整数 \(A_i\) , \(B_i\) 。依次代表第 \(i\) 个人的打饭时间和吃饭时间。
输出格式:
一个整数 \(T\) ,代表所有人吃完饭的最早时刻。
输入输出样例
输入样例:
5
2 2
7 7
1 3
6 4
8 5
输出样例:
17
说明
所有输入数据均为不超过 \(200\) 的正整数。
思路
哇 \(alec\) 你 \(AC\) 了,教我做吧! --Uranus
我看的题解。 --alec
向alec巨佬学习动规中...
首先贪心地思考这道题:如果只有一个窗口,不同打饭时间和吃饭时间的同学要来吃饭,那么所有人都吃完饭的最早时刻怎么求?很容易发现,我们尽量使吃饭最慢的人早打饭,可以提高效率。所以先按照吃饭时间将同学们排序。(不是按照先来后到顺序,真不公平)
那么如何来动规呢?考虑设计状态 \(f[i][j][k]\) 表示前 \(i\) 个同学全部吃上饭,第一个窗口打饭时间为 \(j\) ,第二个窗口打饭时间为 \(k\) 时所有人都吃完饭的最早时刻。
很快发现, \(j+k= \Sigma ^{i}_{p=1}a[p]\) ,而对于每一个 \(i\) , \(\Sigma ^{i}_{p=1}a[p]\) 是固定的。所以我们可以统计前缀和,消掉状态的第三维,进行转移。
同理,我们也可以通过知道 \(j\) 和 \(k\) ,直接计算出 \(i\) ,以此为依据消去第一维,但是此写法过于毒瘤。
转移按照以下方法:
for(int i=1;i<=n;i++)
for(int j=0;j<=sum[i];j++)//sum为统计的前缀和
{
if(node[i].a<=j) f[i][j]=min(f[i][j],max(f[i-1][j-node[i].a],j+node[i].b));//在一号窗口打饭
f[i][j]=min(f[i][j],max(f[i-1][j],sum[i]-j+node[i].b));//在二号窗口打饭
}
那么我们就可以顺利 \(AC\) 了。
AC代码
#include<bits/stdc++.h>
using namespace std;
int n,ans=INT_MAX,f[205][40005],sum[205];
struct Node
{
int a,b;
bool operator < (const Node &sjf) const {return b>sjf.b;}
}node[205];
int read()
{
int re=0;
char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) re=(re<<3)+(re<<1)+ch-'0',ch=getchar();
return re;
}
int main()
{
n=read();
for(int i=1;i<=n;i++) node[i].a=read(),node[i].b=read();
sort(node+1,node+n+1);
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+node[i].a;
memset(f,0x3f,sizeof f);
f[0][0]=0;
for(int i=1;i<=n;i++)
for(int j=0;j<=sum[i];j++)
{
if(node[i].a<=j) f[i][j]=min(f[i][j],max(f[i-1][j-node[i].a],j+node[i].b));
f[i][j]=min(f[i][j],max(f[i-1][j],sum[i]-j+node[i].b));
}
for(int i=0;i<=sum[n];i++) ans=min(ans,f[n][i]);
printf("%d",ans);
return 0;
}
Luogu P2577 [ZJOI2005]午餐(dp)的更多相关文章
- P2577 [ZJOI2005]午餐[DP]
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- Luogu P2577 [ZJOI2005]午餐
一道贪心+类背包DP的好题 首先发现一个十分显然的性质,没有这个性质整道题目都难以下手: 无论两队的顺序如何,总是让吃饭慢的人先排队 这是一个很显然的贪心,因为如果让吃饭慢的排在后面要更多的时间至少没 ...
- 洛谷P2577 [ZJOI2005]午餐 dp
正解:序列dp 解题报告: 传送门! 这题首先要想到一个显然的贪心:每个窗口的排队顺序都是按照吃饭时间从大到小排序的 证明如下: 这种贪心通常都是用微扰法,这题也不例外 现在假如已经确定了每个窗口有哪 ...
- 洛谷P2577 [ZJOI2005]午餐 打饭时间作为容量DP
P2577 [ZJOI2005]午餐 )逼着自己做DP 题意: 有n个人打饭,每个人都有打饭时间和吃饭时间.有两个打饭窗口,问如何安排可以使得总用时最少. 思路: 1)可以发现吃饭时间最长的要先打饭. ...
- [洛谷P2577] [ZJOI2005]午餐
洛谷题目链接:[ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的 ...
- [ZJOI2005]午餐 (DP)
[ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口 ...
- P2577 [ZJOI2005]午餐 状压DP
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- 【题解】洛谷P2577 [ZJOI2005] 午餐(DP+贪心)
次元传送门:洛谷P2577 思路 首先贪心是必须的 我们能感性地理解出吃饭慢的必须先吃饭(结合一下生活) 因此我们可以先按吃饭时间从大到小排序 然后就能自然地想到用f[i][j][k]表示前i个人在第 ...
- luogu 2577 [ZJOI2005]午餐 贪心+dp
发现让 $b$ 更大的越靠前越优,然后依次决策将每个人分给哪个窗口. 令 $f[i][j]$ 表示考虑了前 $i$ 个人,且第一个窗口的总等待时间为 $j$ 的最小总时间. 然后转移一下就好了~ #i ...
随机推荐
- AM运行中的垃圾数据清理
1.下载 filetmpclear.bat 2.打开 这个批处理文件,修改参数 3.按下图 第一个红色框内, 地址: 可以在 AM8服务管理器- 文件服务 ,数据路径后再加 \__Temp__ 第 ...
- 第二章计算机网络ios 模型
机构: ISO国际标准化组织: ITU国际电信联盟: ANSI 美国国家标准委员会: ECMA欧洲计算机制作商协会 ITEF因特网特别任务组. 协议:为计算机网路中进行数据交换而建立的规则,标准或约定 ...
- [JZOJ4763] 【NOIP2016提高A组模拟9.7】旷野大计算
题目 题目大意 给你一个数列,有很多个询问,询问一段区间内,某个数乘它的出现次数的最大值,也就是带权众数. 思考历程 第一次看到这道题,立马想到了树套树之类的二位数据结构,发现不行.(就算可以也很难打 ...
- 解决CentOS“Zabbix discoverer processes 75% busy”的问题
解决CentOS“Zabbix discoverer processes 75% busy”的问题 运维 立杰 4年前 (2014-08-11) 1104℃ 0评论 在使用Zabbix过程中, ...
- 杂项-公司:Amazon
ylbtech-杂项-公司:Amazon 亚马逊公司(Amazon,简称亚马逊:NASDAQ:AMZN),是美国最大的一家网络电子商务公司,位于华盛顿州的西雅图.是网络上最早开始经营电子商务的公司之一 ...
- Spring MVC(十二)--使用ModelView实现重定向
上一篇总结了使用返回字符串的方式实现重定向以及重定向过程中传递字符串参数和pojo参数的过程,本篇总结另一种重定向的实现方式--返回ModelAndView 这次的场景是这样的:在页面输入一些信息添加 ...
- php面向对象的初认识
面向对象的基本概念 面向对象的三大特征:继承 封装 多态 类和对象: 类是一个抽象的概念 对象是一个具体的实例 张三是一个对象,李四也是一个对象.王五同样是一个对象..... 他们都隶属于“人”这个“ ...
- Mybatis Plus 入坑(含最新3.X配置)
简介 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 使用它可以简化单表的操作, 节省开发时间, 国人 ...
- C/C++基础:main函数的参数argc和argv
转载: https://blog.csdn.net/Eastmount/article/details/20413773 一.main()函数参数 通常我们在写主函数时都是void main()或in ...
- linux使用wget
wget is a Linux command-line utility for retrieving files from the web, via HTTP, HTTPS and FTP prot ...