午餐

题目链接

DP题都辣么毒瘤的么。。

首先,看一下题解

我们就有了思路:

贪心:显然,让吃饭慢的先打饭,sort一遍(证明?不存在的。。

DP:f[i][j][k]表示前i个人,窗口1的打饭时间为j,窗口2的打饭时间为k的最早吃完饭的时间

  对于每个人,有两种方案:1.在窗口1打饭  2.在窗口2打饭  (废话)

a[i].ti为第i个人的打饭时间,a[i].t2为第i个人的吃饭时间

f[i][j][k]=max(f[i-1][j-a[i].t1][k],j+a[i].t2);  //排在第一个窗口

f[i][j][k]=max(f[i-1][j][k-a[i].t1],k+a[i].t2);  //排在第二个窗口

优化:我们发现,知道j时,k可以用t1的前缀和求出来,这样可以减一维

   i可以滚动数组滚掉

f[j]=max(f[j-a[i].t1],j+a[i].t2);

f[j]=max(f[j],sum-j+a[i].t2);

#include<algorithm>
#include<cstdio>
#define INF 0x3f3f3f3f
#define re register
#define N 220
int n,f[],ans,sum;
struct NODE{ int t1,t2; } a[N];
inline bool cmp(NODE x,NODE y) { return x.t2>y.t2; }
inline int max(int x,int y) { return x>y?x:y; }
inline int min(int x,int y) { return x<y?x:y; }
inline int read(){
int x=; char c=getchar();
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') { x=(x<<)+(x<<)+c-''; c=getchar(); }
return x;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++){
a[i].t1=read();
a[i].t2=read();
}
std::sort(a+,a++n,cmp);
std::fill(f,f+,INF);
f[]=; int c1,c2;
for(int i=;i<=n;i++){
sum+=a[i].t1;
for(int j=sum;j>=;j--){
if(j>=a[i].t1)
c1=max(f[j-a[i].t1],j+a[i].t2);
else c1=INF;
c2=max(f[j],sum-j+a[i].t2);
f[j]=min(c1,c2);
}
}
ans=INF;
for(int i=;i<=sum;i++)
ans=min(ans,f[i]);
printf("%d\n",ans);
return ;
}

【洛谷P2577】[ZJOI2005]午餐的更多相关文章

  1. 【题解】洛谷P2577 [ZJOI2005] 午餐(DP+贪心)

    次元传送门:洛谷P2577 思路 首先贪心是必须的 我们能感性地理解出吃饭慢的必须先吃饭(结合一下生活) 因此我们可以先按吃饭时间从大到小排序 然后就能自然地想到用f[i][j][k]表示前i个人在第 ...

  2. 洛谷P2577 [ZJOI2005]午餐 打饭时间作为容量DP

    P2577 [ZJOI2005]午餐 )逼着自己做DP 题意: 有n个人打饭,每个人都有打饭时间和吃饭时间.有两个打饭窗口,问如何安排可以使得总用时最少. 思路: 1)可以发现吃饭时间最长的要先打饭. ...

  3. [洛谷P2577] [ZJOI2005]午餐

    洛谷题目链接:[ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的 ...

  4. 洛谷P2577 [ZJOI2005]午餐 dp

    正解:序列dp 解题报告: 传送门! 这题首先要想到一个显然的贪心:每个窗口的排队顺序都是按照吃饭时间从大到小排序的 证明如下: 这种贪心通常都是用微扰法,这题也不例外 现在假如已经确定了每个窗口有哪 ...

  5. 洛谷 P2577 [ZJOI2005]午餐

    这道题目比较难想. 题解: 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个人,在1号窗口打饭 ...

  6. 洛谷 P2577 [ZJOI2005]午餐 题解

    每日一题 day56 打卡 Analysis 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个 ...

  7. BZOJ1899或洛谷2577 [ZJOI2005]午餐

    BZOJ原题链接 洛谷原题链接 解决这题得先想到一个贪心:吃饭慢的先排队. 并不会证明(感觉显然 设\(f[i][j][k]\)表示已经排好了前\(i\)人,第一个队伍需要花费的打饭时间为\(j\), ...

  8. 洛谷 2577 [ZJOI2005]午餐——序列dp

    题目:https://www.luogu.org/problemnew/show/P2577 可以从只有一个窗口的角度思考出一个贪心结论.就是应当按吃饭时间(不算打饭时间)从大到小排序.这样交换相邻两 ...

  9. Luogu P2577 [ZJOI2005]午餐(dp)

    P2577 [ZJOI2005]午餐 题面 题目描述 上午的训练结束了, \(THU \ ACM\) 小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...

随机推荐

  1. 2.3 js基础--DOM

    一.javascript组成         ECMAScript:核心解释器[为我们提供好了最基本的功能:变量声明.函数.语法.运算].   兼容性:完全兼容.           DoM:文档对象 ...

  2. java io 学习笔记(一)

    java的IO操作都在java.io包下面,这个包下面有12个接口和而是多各类,类从读写的角度可以分为两种,一种是用于读,一种是用于写:从字符流字节流的角度,也可以分为两种,一种和字符有关,一种和字节 ...

  3. bzoj 5314: [Jsoi2018]潜入行动

    Description 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY已经联系好了黄金舰队,打算联合所有JSO Ier抵御外星人的进攻.在黄金舰队就位之前,JYY打算事先了解外星人 ...

  4. 深入理解JavaScript系列(13):This? Yes,this!

    介绍 在这篇文章里,我们将讨论跟执行上下文直接相关的更多细节.讨论的主题就是this关键字.实践证明,这个主题很难,在不同执行上下文中this的确定经常会发生问题. 许多程序员习惯的认为,在程序语言中 ...

  5. jqGrid -treeGrid 按需加载

    Load Rows On Demand (AJAX) 参考:http://www.guriddo.net/demo/treegridjs/

  6. zookeeper入门教程

    zookeeper使用场景,不是很难了解,感觉zk监听节点变化,这个功能比较厉害.zk存储的节点组织结构有点像unix文件系统 1.安装zk 运行环境 centos 7 java 8 zookeepe ...

  7. IO流之转换流

    转换流 OutputStreamWriter类 查阅OutputStreamWriter的API介绍,OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流 ...

  8. Django——CBV与FBV

    一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 二.CBV CBV(class base views) 就是在视图里使用类处理请求. Python是一个面 ...

  9. ie 9 渐变背景色兼容问题

    /*窗口背景*/  .window {    background-color: #fff;    background: -webkit-linear-gradient(top,#EFF5FF 0, ...

  10. linux 中环境变量配置文件说明

    1. 修改/etc/profile文件 特点:所有用户的shell都有权使用你配置好的环境变量 说明:如果你的电脑仅用作开发,建议使用此配置,因为所有用户的shell都有权使用你配置好的环境变量,所以 ...