贪它,再大力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的更多相关文章

  1. 【BZOJ1899】[Zjoi2004]Lunch 午餐 贪心+DP

    [BZOJ1899][Zjoi2004]Lunch 午餐 Description 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...

  2. BZOJ1899 [Zjoi2004]Lunch 午餐 贪心+DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1899 题解 如果只有一个窗口,那么可以这样考虑:因为最后一个人打完饭的时间是固定的,那么不如就 ...

  3. bzoj 1899: [Zjoi2004]Lunch 午餐

    Description 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以 ...

  4. 【bzoj1899】[Zjoi2004]Lunch 午餐(贪心+dp)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1899 显然为了节省时间,吃饭慢的人要先打饭.于是我们可以先把所有人按吃饭时间排序,于是 ...

  5. 【bzoj1899】[Zjoi2004]Lunch 午餐 dp

    题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...

  6. Bzoj1899: [Zjoi2004]Lunch 午餐

    题面 传送门 Sol 首先显然吃饭久的要排在前面 之后再来分配队伍,设\(f[i][j]\)表示到第\(i\)个人,\(A\)队伍要等\(j\)的最小吃完饭时间 那么就是一个简单的背包吧... # i ...

  7. [BZOJ1899][ZJOI2004]Lunch 午餐 (DP)

    比较水的DP 但是比较难想 整体思路还是很好理解的 在洛谷的题解里有一个一维的 > 什么时候去看一下 下面发我的代码 #include<bits/stdc++.h> #define ...

  8. luogu 2577 [ZJOI2005]午餐 贪心+dp

    发现让 $b$ 更大的越靠前越优,然后依次决策将每个人分给哪个窗口. 令 $f[i][j]$ 表示考虑了前 $i$ 个人,且第一个窗口的总等待时间为 $j$ 的最小总时间. 然后转移一下就好了~ #i ...

  9. [luogu P2647] 最大收益(贪心+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...

随机推荐

  1. Ruby 仿 C 结构体:CStruct 的一些例子

    1. [代码]最简单的例子     # CStruct Examplesrequire 'cstruct' # example:# struct Point in C\C++        (32-b ...

  2. Java编程思想(18~22)

    第18章 Java I/O系统 18.1 File 类 18.1.1 目录列表器 18.1.2 目录实用工具 18.1.3 目录的检查及创建18.2 输入和输出 在Java 1.0中类库的设计者限定于 ...

  3. (转)RTSP协议详解

    转自:https://www.cnblogs.com/lidabo/p/6553212.html RTSP简介     RTSP(Real Time Streaming Protocol)是由Real ...

  4. hdu-5818 Joint Stacks(模拟)

    题目链接: Joint Stacks Time Limit: 8000/4000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Othe ...

  5. poj-1986 Distance Queries(lca+ST+dfs)

    题目链接: Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 11531   Accepted ...

  6. 【Shell】Linux 一行 多命令

    http://www.cnblogs.com/koreaseal/archive/2012/05/28/2522178.html 要实现在一行执行多条Linux命令,分三种情况: 1.&&am ...

  7. POJ-3680:Intervals (费用流)

    You are given N weighted open intervals. The ith interval covers (ai, bi) and weighs wi. Your task i ...

  8. zero to one (2)

    kali虚拟机整理 关于kali的虚拟机,我搞崩过很多次,重新安装了很多次,也遇到了很多问题,有一些解决不了的就重新安装,费时费力,要善于用虚拟机. 关于网络配置的问题 关于网络配置,在这里我想主要记 ...

  9. Scrapy,终端startproject,显示错误TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

    F:\python_project\test>scrapy startproject spz Traceback (most recent call last): File "d:\p ...

  10. poj3585树最大流——换根法

    题目:http://poj.org/problem?id=3585 二次扫描与换根法,一次dfs求出以某个节点为根的相关值,再dfs遍历一遍树,根据之前的值换根取最大值为答案. 代码如下: #incl ...