【BZOJ1899】午餐(动态规划)
【BZOJ1899】午餐(动态规划)
题面
题解
我太弱了
这种\(dp\)完全做不动。。
首先,感性理解一些
如果所有人都要早点走,
那么,吃饭时间长的就先吃
吃饭时间短的就晚点吃
所以,按照吃饭时间排序
我们不难得出一个每个人吃完饭的时间
之和前面所有人的打饭的时间和有关
所以
\(f[i][j][k]\)表示当前做到第\(i\)个人,第一列,第二列前面的人的打饭时间之和分别为\(j,k\)时,最后一个人吃完饭的最小时间
因为人的顺序我们是知道的
所以\(j+k\)是一个定值,是所有人打饭时间的前缀和
因此我们只需要记录其中一个
所以,状态是\(f[i][j]\)表示当前做到第\(i\)个人,
第一列队伍前面所有人打饭的时间和是\(j\)时
最后一个人吃完饭的最小时间
如果把这个人放在第一列
\(f[i][j]=min(f[i][j],max(f[i-1][j-Get[i]],j+eat[i]))\)
这个应该不难理解
另外一个,把这个人放在第二列
\(f[i][j]=max(f[i-1][j],sum[i]-j+eat[i])\)
这题应该是一个很显然的\(dp\)
但是我却做不出来
我果然太弱了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 210
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Peo{int a,b;}p[MAX];
int s[MAX],ans=2e9;
int f[MAX][MAX*MAX],n;
bool operator<(Peo a,Peo b)
{
if(a.b!=b.b)return a.b>b.b;
else return a.a>b.a;
}
int main()
{
n=read();
for(int i=1;i<=n;++i)p[i].a=read(),p[i].b=read();
sort(&p[1],&p[n+1]);
for(int i=1;i<=n;++i)s[i]=s[i-1]+p[i].a;
memset(f,63,sizeof(f));
f[0][0]=0;
for(int i=1;i<=n;++i)
{
for(int j=s[i-1];j>=0;--j)
{
f[i][j+p[i].a]=min(f[i][j+p[i].a],max(f[i-1][j],j+p[i].a+p[i].b));
f[i][j]=max(f[i-1][j],s[i-1]-j+p[i].a+p[i].b);
}
}
for(int i=0;i<=s[n];++i)ans=min(f[n][i],ans);
printf("%d\n",ans);
return 0;
}
【BZOJ1899】午餐(动态规划)的更多相关文章
- luogu2577/bzoj1899 午餐 (贪心+dp)
首先,应该尽量让吃饭慢的排在前面,先按这个排个序 然后再来决定每个人到底去哪边 设f[i][j]是做到了第i个人,然后1号窗口目前的总排队时间是j,目前的最大总时间 有这个i和j的话,再预处理出前i个 ...
- Luogu 2577[ZJOI2005]午餐 - 动态规划
Solution 啊... 我太菜了唔 不看题解是不可能的, 这辈子都不可能的. 首先一个队伍中排队轮到某个人的时间是递增的, 又要加上吃饭时间, 所以只能使吃饭时间递减, 才能满足最优,于是以吃饭时 ...
- 【BZOJ1899】[Zjoi2004]Lunch 午餐 贪心+DP
[BZOJ1899][Zjoi2004]Lunch 午餐 Description 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...
- 【bzoj1899】[Zjoi2004]Lunch 午餐(贪心+dp)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1899 显然为了节省时间,吃饭慢的人要先打饭.于是我们可以先把所有人按吃饭时间排序,于是 ...
- [BZOJ1899]Lunch 午餐(DP)
[BZOJ1899] 首先有个很贪心的思路,吃饭时间长的最先打饭为最优,所以开始先排个序 然后考虑DP,我们不需要知道某个人在哪个对,只要关注总的时间就行了 肯定需要一维表示当前同学编号,还需要表示某 ...
- 【bzoj1899】[Zjoi2004]Lunch 午餐 dp
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- [ZJOI2005]午餐 (贪心,动态规划)
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- Bzoj1899: [Zjoi2004]Lunch 午餐
题面 传送门 Sol 首先显然吃饭久的要排在前面 之后再来分配队伍,设\(f[i][j]\)表示到第\(i\)个人,\(A\)队伍要等\(j\)的最小吃完饭时间 那么就是一个简单的背包吧... # i ...
- [BZOJ1899][ZJOI2004]Lunch 午餐 (DP)
比较水的DP 但是比较难想 整体思路还是很好理解的 在洛谷的题解里有一个一维的 > 什么时候去看一下 下面发我的代码 #include<bits/stdc++.h> #define ...
随机推荐
- 学习docker on windows (1): 为什么要使用docker
为什么要用Docker? 如果我们想使用某种pc软件, 那么在互联网上查找并安装软件的流程大致如下图: 那么这就有几个问题要弄清楚: 从哪里获得软件 App Store Linux的包管理 从某些网站 ...
- .35-浅析webpack源码之babel-loader入口文件路径读取
在处理./input.js入口文件时,在类型判断被分为普通文件,所以走的文件事件流,最后拼接得到文件的绝对路径. 但是对应"babel-loader"这个字符串,在如下正则中被判定 ...
- 重写equals()和hashCode()
什么时候需要重写equals()? 只有当一个实例等于它本身的时候,equals()才会返回true值.通俗地说,此时比较的是两个引用是否指向内存中的同一个对象,也可以称做是否实例相 等.而我们在使用 ...
- Angular2 ^ 资源链接
Angular2 资源链接 Material Desgin 2 githubhttps://github.com/Promact/md2 DEMOhttp://code.promactinfo.co ...
- 自动统计安卓log中Anr,Crash,Singnal出现数量的Python脚本
作为测试,在测试工作中一定会经常抓log,有时log收集时间很长,导致log很大,可能达到几G,想找到能打开如此大的log文件的工具都会变得困难:即使log不大时,我们可以直接把log发给开发同学去分 ...
- Linux常见目录及其作用
在Linux操作系统中,所有文件和目录都被组织成一个以根节点开始的倒置的树状结构.如下图 系统一般以 / 来表示根目录.在根目录之下的可以是目录也可以是文件,而每一个目录中又可以包含子目录文件.如此反 ...
- hdu3480 Division(dp平行四边形优化)
题意:将n个数分成m段,每段的代价为最大值减最小值的平方,为代价最小是多少n<=10000 ,m<=5000 题解:先拍好序,从小到大,这样绝对是花费最小的,不过怎么样来做呢?一定很容易想 ...
- maven中的传递依赖和传递依赖的解除
例如创建三个maven工程A B C pom文件分别为 A <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns: ...
- LeetCode第四天
leetcode 第四天 2018年1月4日 15.(628)Maximum Product of Three Numbers JAVA class Solution { public int max ...
- 区块链 PoW 与 PoS 的纷争
最近在研究区块链,可能会有一些非前端文章,感兴趣的可以关注关注哟. 有关注区块链的,肯定会经常看到这两个名词 -- PoW 与 PoS.但是很多人对他们的含义的理解存在很多偏差.那么他们的含义与区别是 ...