【简●解】[ZJOI2005]午餐
【关键词】
- \(DP\)
- 排序/贪心
【分析】
首先,一个很明显的贪心思路,就是吃的慢的人先打饭。所以把数据按吃饭时间从大到小排一遍序。
根据\(dp\)的尿性,比较容易想到一个\(dp\)方程\(f[i][j][k]\):前\(i\)个人,在一号窗口打饭总时间为\(j\),在二号窗口打饭总时间为\(k\)的最早集合时间。
然后转移。。。
从方程中就可以看出,这爆空间了啊。
所以优化。
我们可以发现,\(j+k=\)前\(i\)个人打饭时间总和,所以\(k=sum(i)-j\),所以维护下打饭时间的前缀和就行了,于是,我们就可以去掉一维:
f[i][j]表示前i个人,在一号窗口打饭总时间\(j\),最早集合的时间。
那么每次转移有两种决策。
- 将第\(i\)个人放在一号窗口,即: \(max(f[i-1][j-s[i].wait], j+s[i].eat)\)
- 将第\(i\)个人放在二号窗口,即: \(max(f[i-1][j], sum[i]-j+s[i].eat)\)
然后取个最小值,输出,完事。
【Code】
//#include<bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("O2")
#include<cmath>
#include<ctime>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debug() puts("FBI WARNING!")
#define R register
#define I inline
using namespace std;
const int MAX = 200 + 5;
inline int read(){
int f = 1, x = 0;char ch;
do { ch = getchar(); if (ch == '-') f = -1; } while (ch < '0'||ch>'9');
do {x = x*10+ch-'0'; ch = getchar(); } while (ch >= '0' && ch <= '9');
return f*x;
}
int n, sum[MAX], f[MAX][MAX * MAX], ans = 0x7ffffff;
struct sakura {
int eat, wait;
}sak[MAX];
inline bool cmp(const sakura &a, const sakura &b) {
return a.eat > b.eat;
}
int main(){
n = read();
for (R int i = 1;i <= n; ++i) {
sak[i].wait = read(), sak[i].eat = read();
}
memset(f, 127, sizeof (f));
f[0][0] = 0;
sort(sak + 1, sak + 1 + n, cmp);
for (int i = 1;i <= n; ++i) sum[i] = sum[i - 1] + sak[i].wait;
for (int i = 1;i <= n; ++i) {
for (int j = 0;j <= sum[i]; ++j) {
if (j >= sak[i].wait) {
f[i][j] = min(f[i][j], max(f[i-1][j-sak[i].wait], j+sak[i].eat));
}
f[i][j] = min(f[i][j], max(f[i-1][j], sum[i]-j+sak[i].eat));
}
}
for (int i = 0;i <= sum[n]; ++i) {
ans = min(ans, f[n][i]);
}
printf("%d", ans);
return 0;
}
【简●解】[ZJOI2005]午餐的更多相关文章
- python ConfigParser、shutil、subprocess、ElementTree模块简解
ConfigParser 模块 一.ConfigParser简介ConfigParser 是用来读取配置文件的包.配置文件的格式如下:中括号“[ ]”内包含的为section.section 下面为类 ...
- [洛谷P2577] [ZJOI2005]午餐
洛谷题目链接:[ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的 ...
- [ZJOI2005]午餐 (DP)
[ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口 ...
- 洛谷P2577 [ZJOI2005]午餐 打饭时间作为容量DP
P2577 [ZJOI2005]午餐 )逼着自己做DP 题意: 有n个人打饭,每个人都有打饭时间和吃饭时间.有两个打饭窗口,问如何安排可以使得总用时最少. 思路: 1)可以发现吃饭时间最长的要先打饭. ...
- Luogu P2577 [ZJOI2005]午餐(dp)
P2577 [ZJOI2005]午餐 题面 题目描述 上午的训练结束了, \(THU \ ACM\) 小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...
- 2018.09.22 ZJOI2005午餐(贪心+01背包)
描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各有不 ...
- [ZJOI2005]午餐 (贪心,动态规划)
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- P2577 [ZJOI2005]午餐[DP]
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...
- AC题目简解-数据结构
A - Japan POJ 3067 要两条路有交叉,(x1,y1)(x2,y2)那么需要满足:(x1-x2)*(y1-y2)<0判断出这是求逆序的问题 树状数组求逆序,先通过自定义的比较器实 ...
随机推荐
- POJ2718【DFS】
题意: 给你0到9之间的数,然后让你搞成两个数,求一个最小差异值(被组合的数不允许出现前导0) 思路:最小差异那么肯定是有一个整数长n/2,另一个长n-n/2,搜一下就好了. code: #inclu ...
- bzoj 1003: [ZJOI2006]物流运输【spfa+dp】
预处理出ans[i][j]为i到j时间的最短路,设f[i]为到i时间的最小代价,转移显然就是 f[i]=min(f[j-1]+ans[j][i]*(i-j+1)+k); #include<ios ...
- (7)javascript的程序控制结构及语句------(2)循环控制语句、跳转语句、对话框
一.循环控制语句 循环语句主要就是在满足条件的情况下反复执行某一个操作,循环控制语句主要包括while语句.do...while语句 和for语句. 1.While语句 语法: While(条件表达式 ...
- JAVA多线程(一) Thread & Runnable
githut代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service/ ...
- 鸟哥私房菜基础篇:认识与学习BASH习题
猫宁!!! 参考链接:http://linux.vbird.org/linux_basic/0320bash.php 鸟哥是为中国信息技术发展做出巨大贡献的人. 1-在 Linux 上可以找到哪些 s ...
- 第三篇 .NET高级技术之深拷贝和浅拷贝
深拷贝.浅拷贝 如果拷贝的时候共享被引用的对象就是浅拷贝,如果被引用的对象也拷贝一份出来就是深拷贝.(深拷贝就是说重新new一个对象,然后把之前的那个对象的属性值在重新赋值给这个用户) using S ...
- 1-9方法的重写(override)
什么是重写? 重写,也叫做覆盖,当父类中的方法无法满足子类需求时,子类可以将父类的方法进行重写编写来满足需求.比如孩子继承了父亲的房子,可以将房子重新装修. 方法重写的条件: 两个类必须是继承关系 必 ...
- Android APK加壳技术方案
Android APK加壳技术方案[1] Android APK加壳技术方案[2]
- subline应用之python
一交互式命令操作快捷键:在安装SublimeREPL插件后,CTRL+~/CTRL+B分别在命令行交互式和编译模式之间进行选择. 为SublimeREPL配置快捷键(每次运行程序必须用鼠标去点工具栏- ...
- Sublime3注册码和安装中文包
1.Sublime3注册码 在工具栏Help中点击Enter license,粘贴下面一大串 —– BEGIN LICENSE —– Michael Barnes Single User Licens ...