【简●解】[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判断出这是求逆序的问题 树状数组求逆序,先通过自定义的比较器实 ...
随机推荐
- SpringBoot整合Ribbon注入RestTemplate实例找不到原因
通过把@LoadBalanced注解放在创建RestTemplate对象的方法上,可以正常运行:如果放在属性上,会导致找不到RestTemplate Bean
- css里关于浏览器的前缀
今天遇到一个比较坑爹的 -moz-box-sizing: border-box; box-sizing' border-box; 一下子有点懵逼,第一个什么鬼??一查,原来是火狐浏览器的前缀.应该 ...
- (水题)洛谷 - P1598 - 垂直柱状图
https://www.luogu.org/problemnew/show/P1598 忘记读取后清空数组,也不知道准确的长度. #include<bits/stdc++.h> using ...
- yii1 compoment实现自己的db类
突然发现yii1并没有实现mysql的读写分离默认配置,而用yii1的配置实现读写分离又很麻烦,所以我写了一个db的辅助类 首先我们需要配置一下一下辅助db的compoment类,yii的compom ...
- thinkphp5 +elasticsearch
php7使用elasticsearch 1.安装 官网下载地址:https://www.elastic.co/downloads/elasticsearch # 解压到非root目录,运行时使用非ro ...
- SpringSercurity基础
创建 spring 配置文件 spring-security.xml intercept-url 表示拦截页面 /* 表示的是该目录下的资源,只包括本级目录不包括下级目录 /** 表示的是该目 ...
- Oracle数据库创建表空间及用户授权
/*分为四步 */ /*第1步:创建临时表空间 */ create temporary tablespace test_temp tempfile 'E:\app\Administrator\orad ...
- python之类的相关名词解释
变量:在类里面定义的变量,不必实例化即可调用 实例变量:在类里面定义的变量,必须实例化之后才可以调用 比如: 属性方法:调用时看起来像是一个变量,方法没有入参,可以变成一个属性方法 在方法上添加@pr ...
- h5-18-文件操作-兼容判断
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 491 Increasing Subsequences 递增子序列
给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2.示例:输入: [4, 6, 7, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, ...