Luogu P2577 [ZJOI2005]午餐
一道贪心+类背包DP的好题
首先发现一个十分显然的性质,没有这个性质整道题目都难以下手:
无论两队的顺序如何,总是让吃饭慢的人先排队
这是一个很显然的贪心,因为如果让吃饭慢的排在后面要更多的时间至少没有这样优
因此我们先按吃饭时间从大到小sort一下
然后我们发现这是一个类01背包的DP,只不过这里的状态要么是01,要么是10(即要么在1队,要么在2队)
然后这种东西都有一些很神奇的性质,比如说我们用前缀和sum[i]表示前i个人中排队的总时间,那么
sum[i]-前i个人中去1号窗口的人的打饭时间之和=前i个人中去1号窗口的人的打饭时间之和
然后我们可以想出一个DP,用f[i][j]表示前i个人中,在1号窗口排队的人共花了j分钟排队的最优情况下,最少要多少时间(要和2号窗口的取一个min),包括吃饭的时间
然后就有转移:
f[i][j]=min(f[i][j],max(f[i-1][j-a[i].t],j+a[i].e))(在1号窗口打饭)
f[i][j]=min(f[i][j],max(f[i-1][j],sum[i]-j+a[i].e)(在2号窗口打饭)
然后我们发现这个可以滚动存储不过也没这个必要,但是我还是写了
CODE
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=205;
struct data
{
int t,e;
}a[N];
int n,f[2][N*N],sum[N],ans;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline bool comp(data a,data b)
{
return a.e>b.e;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i,j;
for (read(n),i=1;i<=n;++i)
read(a[i].t),read(a[i].e);
sort(a+1,a+n+1,comp);
for (i=1;i<=n;++i)
sum[i]=sum[i-1]+a[i].t;
memset(f[0],63,sizeof(f[0])); f[0][0]=0;
for (i=1;i<=n;++i)
{
int now=i&1,last=now^1;
memset(f[now],63,sizeof(f[now])); ans=f[now][0];
for (j=sum[i];j>=0;--j)
{
if (j>=a[i].t) f[now][j]=min(f[now][j],max(f[last][j-a[i].t],j+a[i].e));
if (sum[i]-j>=a[i].t) f[now][j]=min(f[now][j],max(f[last][j],sum[i]-j+a[i].e));
}
}
for (i=0;i<=sum[n];++i)
ans=min(ans,f[n&1][i]);
printf("%d",ans);
}
Luogu P2577 [ZJOI2005]午餐的更多相关文章
- Luogu P2577 [ZJOI2005]午餐(dp)
P2577 [ZJOI2005]午餐 题面 题目描述 上午的训练结束了, \(THU \ ACM\) 小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...
- 洛谷P2577 [ZJOI2005]午餐 打饭时间作为容量DP
P2577 [ZJOI2005]午餐 )逼着自己做DP 题意: 有n个人打饭,每个人都有打饭时间和吃饭时间.有两个打饭窗口,问如何安排可以使得总用时最少. 思路: 1)可以发现吃饭时间最长的要先打饭. ...
- [洛谷P2577] [ZJOI2005]午餐
洛谷题目链接:[ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的 ...
- P2577 [ZJOI2005]午餐 状压DP
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- P2577 [ZJOI2005]午餐
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- 【题解】洛谷P2577 [ZJOI2005] 午餐(DP+贪心)
次元传送门:洛谷P2577 思路 首先贪心是必须的 我们能感性地理解出吃饭慢的必须先吃饭(结合一下生活) 因此我们可以先按吃饭时间从大到小排序 然后就能自然地想到用f[i][j][k]表示前i个人在第 ...
- P2577 [ZJOI2005]午餐[DP]
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- Luogu 2577[ZJOI2005]午餐 - 动态规划
Solution 啊... 我太菜了唔 不看题解是不可能的, 这辈子都不可能的. 首先一个队伍中排队轮到某个人的时间是递增的, 又要加上吃饭时间, 所以只能使吃饭时间递减, 才能满足最优,于是以吃饭时 ...
- 洛谷P2577 [ZJOI2005]午餐 dp
正解:序列dp 解题报告: 传送门! 这题首先要想到一个显然的贪心:每个窗口的排队顺序都是按照吃饭时间从大到小排序的 证明如下: 这种贪心通常都是用微扰法,这题也不例外 现在假如已经确定了每个窗口有哪 ...
随机推荐
- ADB三个进阶使用
adb通过Wi-Fi连接手机 背景知识 Android系统底层运行着一个服务(adbd),也就是在手机系统内部,用于响应.管理大家在电脑端的adb命令连接,这个服务在启动时候会根据手机的配置监听USB ...
- mysql主从不同步问题 Error_code: 1236
第一种情况,开启GTID,从库与主库不同步. 1.在从库上查看从的状态 mysql> show slave status \G *************************** 1. ...
- 【概率论】条件概率 & 全概率公式 & 朴素贝叶斯公式
0. 说明 条件概率 & 全概率公式 & 朴素贝叶斯公式 学习笔记 参考 scikit-learn机器学习(五)--条件概率,全概率和贝叶斯定理及python实现 1. 条件概率 [定 ...
- [Python_2] Python 基础
0. 说明 Python 基础笔记,使用的版本为 Python 3.6.2 Python 的变量.字符串操作.list.元组.字典.循环.range.类型转换.运算等操作. 1. 引号的使用 字符串使 ...
- idea 断点上面有x
背景:确定你的java代码没有问题,并且编译通过 问题:debug 启动项目的时候没有问题,idea打断点的时候左边红色断点上面有x 原因:java文件和class文件不一致, 解决方法:ant cl ...
- qt调用sql server存储过程并获取output参数
最近新做的一个项目需要使用qt5连接另一台机器上的sql server,虽然网上已有类似文章,但还是有些其中很少提及的问题,故在这里汇总下: qt连接sql server可以参考这篇文章: <Q ...
- 树莓派踩坑备忘录 -- 使用 Linux
目录 一,工欲善其事,必先利其器 二,开机必备 三,更新 apt-get 源与软件搜索 四,安装 .NET Core 五,文件传输 六,搜索与安装软件 七,常见缺少的 xxx.so 八,小技巧与工具 ...
- vc使用jsoncpp头文件冲突问题
编译时出现 1>d:\program files (x86)\microsoft visual studio 9.0\vc\include\xdebug(32) : warning C4229: ...
- Alpha- 事后诸葛亮(麻瓜制造者)
目录 预期计划 现实进展 团队体会 成员分工及工作量比例 会议总结 预期计划 在Alpha阶段开始之前,我们的预期计划是:从用户登录,发布商品.发布求购信息的基本功能开始做起.用户登录使用输入教务处的 ...
- 【Android自动化】编写一个log模块,输出至控制台,供程序运行查看
# -*- coding:utf-8 -*- import logging def get_log(name): log = logging.getLogger(name) log.setLevel( ...