BZOJ 1899&&luogu P2577: [Zjoi2004]Lunch 午餐 贪心+DP
贪它,再大力DP(话说觉得此题简单的真的是大佬QAQ)我想了两天。。。QWQ
贪心:吃饭慢的先打饭(不太会证。。。)
DP:f[i][j]表示前i个人,在1号窗口打饭的总时间时j,的最短时间
确定i的时候,通过j,可以算出在二号窗口打饭的总时间。。
所以有:
第i个人在1号窗口:if(j>=a[i].t) f[i][j]=min(f[i][j],max(f[i-1][j-a[i].t],j+a[i].w));
第i个人在2号窗口:f[i][j]=min(f[i][j],max(f[i-1][j],d[i]-j+a[i].w));
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define R register int
using namespace std;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
struct node{int t,w; bool operator <(const node& y)const{return w>y.w;}}a[];
int n,f[][],d[],ans=0x3f3f3f3f;
signed main() {
n=g(); for(R i=;i<=n;++i) a[i].t=g(),a[i].w=g();
sort(a+,a+n+); memset(f,0x3f,sizeof f); f[][]=;
for(R i=;i<=n;++i) d[i]=d[i-]+a[i].t;
for(R i=;i<=n;++i) for(R j=;j<=d[i];++j) {
if(j>=a[i].t) f[i][j]=min(f[i][j],max(f[i-][j-a[i].t],j+a[i].w));
f[i][j]=min(f[i][j],max(f[i-][j],d[i]-j+a[i].w));
} for(R i=;i<=d[n];++i) ans=min(ans,f[n][i]); printf("%d\n",ans);
}
然后可以顺便压成一维的。。。(不知为何跑的飞快QAQ)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define R register int
using namespace std;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
struct node{int t,w; bool operator <(const node& y)const{return w>y.w;}}a[];
int n,f[],d[],ans=0x3f3f3f3f;
signed main() {
n=g(); for(R i=;i<=n;++i) a[i].t=g(),a[i].w=g();
sort(a+,a+n+); memset(f,0x3f,sizeof f); f[]=;
for(R i=;i<=n;++i) d[i]=d[i-]+a[i].t;
memset(f,0x3f,sizeof f); f[]=;
for(R i=;i<=n;++i) for(R j=d[i-];j>=;--j){
f[j+a[i].t]=min(f[j+a[i].t],max(f[j],j+a[i].t+a[i].w));
f[j]=max(f[j],d[i-]-j+a[i].t+a[i].w);
} for(R i=;i<=d[n];++i) ans=min(ans,f[i]); printf("%d\n",ans);
}
2019.04.07/08
BZOJ 1899&&luogu P2577: [Zjoi2004]Lunch 午餐 贪心+DP的更多相关文章
- 【BZOJ1899】[Zjoi2004]Lunch 午餐 贪心+DP
[BZOJ1899][Zjoi2004]Lunch 午餐 Description 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...
- BZOJ1899 [Zjoi2004]Lunch 午餐 贪心+DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1899 题解 如果只有一个窗口,那么可以这样考虑:因为最后一个人打完饭的时间是固定的,那么不如就 ...
- bzoj 1899: [Zjoi2004]Lunch 午餐
Description 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以 ...
- 【bzoj1899】[Zjoi2004]Lunch 午餐(贪心+dp)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1899 显然为了节省时间,吃饭慢的人要先打饭.于是我们可以先把所有人按吃饭时间排序,于是 ...
- 【bzoj1899】[Zjoi2004]Lunch 午餐 dp
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- Bzoj1899: [Zjoi2004]Lunch 午餐
题面 传送门 Sol 首先显然吃饭久的要排在前面 之后再来分配队伍,设\(f[i][j]\)表示到第\(i\)个人,\(A\)队伍要等\(j\)的最小吃完饭时间 那么就是一个简单的背包吧... # i ...
- [BZOJ1899][ZJOI2004]Lunch 午餐 (DP)
比较水的DP 但是比较难想 整体思路还是很好理解的 在洛谷的题解里有一个一维的 > 什么时候去看一下 下面发我的代码 #include<bits/stdc++.h> #define ...
- luogu 2577 [ZJOI2005]午餐 贪心+dp
发现让 $b$ 更大的越靠前越优,然后依次决策将每个人分给哪个窗口. 令 $f[i][j]$ 表示考虑了前 $i$ 个人,且第一个窗口的总等待时间为 $j$ 的最小总时间. 然后转移一下就好了~ #i ...
- [luogu P2647] 最大收益(贪心+dp)
题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...
随机推荐
- Ruby 仿 C 结构体:CStruct 的一些例子
1. [代码]最简单的例子 # CStruct Examplesrequire 'cstruct' # example:# struct Point in C\C++ (32-b ...
- Java编程思想(18~22)
第18章 Java I/O系统 18.1 File 类 18.1.1 目录列表器 18.1.2 目录实用工具 18.1.3 目录的检查及创建18.2 输入和输出 在Java 1.0中类库的设计者限定于 ...
- (转)RTSP协议详解
转自:https://www.cnblogs.com/lidabo/p/6553212.html RTSP简介 RTSP(Real Time Streaming Protocol)是由Real ...
- hdu-5818 Joint Stacks(模拟)
题目链接: Joint Stacks Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- poj-1986 Distance Queries(lca+ST+dfs)
题目链接: Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 11531 Accepted ...
- 【Shell】Linux 一行 多命令
http://www.cnblogs.com/koreaseal/archive/2012/05/28/2522178.html 要实现在一行执行多条Linux命令,分三种情况: 1.&&am ...
- POJ-3680:Intervals (费用流)
You are given N weighted open intervals. The ith interval covers (ai, bi) and weighs wi. Your task i ...
- zero to one (2)
kali虚拟机整理 关于kali的虚拟机,我搞崩过很多次,重新安装了很多次,也遇到了很多问题,有一些解决不了的就重新安装,费时费力,要善于用虚拟机. 关于网络配置的问题 关于网络配置,在这里我想主要记 ...
- Scrapy,终端startproject,显示错误TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
F:\python_project\test>scrapy startproject spz Traceback (most recent call last): File "d:\p ...
- poj3585树最大流——换根法
题目:http://poj.org/problem?id=3585 二次扫描与换根法,一次dfs求出以某个节点为根的相关值,再dfs遍历一遍树,根据之前的值换根取最大值为答案. 代码如下: #incl ...