【[ZJOI2005]午餐】
首先我们得贪心一下,让吃饭时间较长的人排在队首
去抄一段贪心的证明吧
现在研究在一个队伍里的人有什么性质
可以发现道题里也有一个不变量,就是对于队伍里的前\(i\)个人,不管他们排队的顺序如何,\(a[i]\)的前缀和\(s[i]\)是不会变的,第\(i\)个人会在\(s[i]+b[i]\)时刻吃完,这前\(i\)个人的吃饭时间是\(max(s[j]+b[j])\)
现在可以回到贪心的问题上了,假设对于两个相邻的人\(i\)和\(i+1\),如果\(a[i]==a[i+1]\),那么显然让\(b[i]>b[i+1]\)好
由上面的性质可以看到\(s[i]\)是守恒的,那么让第\(i\)个人的\(b[i]\)是前\(i\)个人里最小的当然就是坠吼的啦
之后就可以dp了
感觉自己dp的姿势不太对
最开始yy出来的状态是\(dp[i][j]\)表示前\(i\)个人里\(j\)个人去了一个队列时消耗时间最长的人的最小耗时
但是这个状态显然不对,因为我们不知道这\(j\)个人的总的等待时间,好想没有什么办法进行转移
于是缺一个状态就加上一维吧,那就用\(dp[i][j][k]\)表示前\(i\)个人里\(j\)个人去了一个队列时等待时间为\(k\)消耗时间最长的人的最小耗时
发现这样的话空间好像要炸的样子,尽管开滚动好像都不太行
但是又发现第二维好像没有什么存的必要,因为转移的时候根本就跟这个队列里有多少人没有关系
于是最后的状态就是\(dp[i][j]\)表示前\(i\)个人里一个队列总等待时间为\(k\)消耗时间最长的人的最小耗时
我们考虑一下如何转移,因为这两个队列本质是相同的,所以一个人有两种选择,一个就是进入在状态里表示的那个队列,在一个就是进入另一个队列
进入状态里表示的这个队列的话,这个队列的总时长会增加,等待时间最长的人可能也会有变化
于是就有
\]
进入另外一个队列,这个队列的等待时长没有变化,但是我们需要知道另外一个队列所有人的总等待时间,由于我闷知道这个队列的总等待时间是\(j\),那么我们用一个前缀和就能求出来另外一个队列的总等待时间
\]
代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define re register
#define maxn 205
#define INF 336860180
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
struct Node
{
int a,b;
}t[maxn];
int n;
int dp[201][200*200+1];
int pre[maxn];
int o;
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
inline int cmp(Node AA,Node BB)
{
return AA.b>BB.b;
}
int main()
{
n=read();
for(re int i=1;i<=n;i++)
t[i].a=read(),t[i].b=read();
std::sort(t+1,t+n+1,cmp);
for(re int i=1;i<=n;i++)
pre[i]=pre[i-1]+t[i].a;
memset(dp,20,sizeof(dp));
dp[1][t[1].a]=t[1].a+t[1].b;
for(re int i=2;i<=n;i++)
{
for(re int j=0;j<=200*200;j++)
{
if(dp[i-1][j]==INF) continue;
dp[i][j+t[i].a]=min(max(dp[i-1][j],j+t[i].a+t[i].b),dp[i][j+t[i].a]);
dp[i][j]=min(dp[i][j],max(dp[i-1][j],pre[i-1]-j+t[i].a+t[i].b));
}
}
int ans=INF;
for(re int i=1;i<=200*200;i++)
ans=min(ans,dp[n][i]);
std::cout<<ans;
return 0;
}
【[ZJOI2005]午餐】的更多相关文章
- [洛谷P2577] [ZJOI2005]午餐
洛谷题目链接:[ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的 ...
- [ZJOI2005]午餐 (DP)
[ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口 ...
- 洛谷P2577 [ZJOI2005]午餐 打饭时间作为容量DP
P2577 [ZJOI2005]午餐 )逼着自己做DP 题意: 有n个人打饭,每个人都有打饭时间和吃饭时间.有两个打饭窗口,问如何安排可以使得总用时最少. 思路: 1)可以发现吃饭时间最长的要先打饭. ...
- Luogu P2577 [ZJOI2005]午餐(dp)
P2577 [ZJOI2005]午餐 题面 题目描述 上午的训练结束了, \(THU \ ACM\) 小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...
- 2018.09.22 ZJOI2005午餐(贪心+01背包)
描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各有不 ...
- P2577 [ZJOI2005]午餐 状压DP
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- P2577 [ZJOI2005]午餐
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- 【洛谷P2577】[ZJOI2005]午餐
午餐 题目链接 DP题都辣么毒瘤的么.. 首先,看一下题解 我们就有了思路: 贪心:显然,让吃饭慢的先打饭,sort一遍(证明?不存在的.. DP:f[i][j][k]表示前i个人,窗口1的打饭时间为 ...
- [ZJOI2005]午餐 (贪心,动态规划)
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- P2577 [ZJOI2005]午餐[DP]
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
随机推荐
- mybatis学习之动态sql
mybatis的动态sql语句很强大,在mapper映射文件中使用简单的标签即可实现该效果,下面一个个记录: 1.select查询 简单的select类似如下: <select id=" ...
- python os.popen 乱码问题
os.popen('ipconfig') 命令返回的结果在调试时乱码了: output1 = os.popen('ipconfig') o1=output1.read() 我猜这里输出的内容要和控制台 ...
- HTML5数据存储方案data与jQuery数据存储方案$.data()的区别
我们先看下$.fn.data()的使用,这个和$.data()是不一样的,前者是和某个jquery对象相关,后者则是全局方法.主要有data()和removeData()这2个实例方法.通过下面的例子 ...
- 读ios开发有感——建立APP开发体系
前言:ios开发和现在的大前端.跨端开发在底层上的道理是相通的,因此通过学习ios开发,可以形成对APP开发体系的理解. 一.app开发的知识体系 基础 应用开发 原理 原生与前端 二.基础模块 按照 ...
- python----openpyxl模块
openpyxl 模块 1.openpyxl的写 from openpyxl import Workbook wb = Workbook() # 方式一: 默认创建sheet在最后 wb1 = wb. ...
- AngularJS $watch 监听
监听$watch 监听数据变化,有三个参数 $scope.$watch(“监听的属性”,function(new,old){},true); 写true的时候可以监听一个对象里的多个数据变化,不写tr ...
- QQ 聊天机器人小薇 1.0.1 发布!
本次发布主要解决了消息丢失(Api返回码[1202])问题,并改进了改进了一些细节. 简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动: 监听多个 Q ...
- ASP.NET内容页中访问母版页中的对象
在ASP.NET2.0开始,提供了母版页的功能.母版页由一个母版页和多个内容页构成.母版页的主要功能是为ASP.NET应用程序中的页面创建相同的布局和界面风格.母版页的使用与普通页面类似,可以在其中放 ...
- libgdx for eclipse开发环境搭建
1.安装jdk1.7以上 2.下载libgdx1.2.0 下载地址:https://libgdx.badlogicgames.com/releases 3.下载项目创建工具(老版本的) 下载地址:ht ...
- [翻译] 单例(Singleton)
英文原文: https://sourcemaking.com/design_patterns/singleton 意图 确保一个类只有一个实例,并提供一个访问其实例的全局点: 封装 “即时初始化” ( ...