BZOJ1899或洛谷2577 [ZJOI2005]午餐
BZOJ原题链接
洛谷原题链接
解决这题得先想到一个贪心:吃饭慢的先排队。
并不会证明(感觉显然
设\(f[i][j][k]\)表示已经排好了前\(i\)人,第一个队伍需要花费的打饭时间为\(j\),第二个队伍需要花费的打饭时间为\(k\),最后一个吃完饭的时刻。
显然这会\(MLE\)(滚动数组也救不了你
实际上,我们可以将\(k\)这一维舍去。设\(S[i]\)表示前\(i\)个人打饭所需要的时间,即前缀和。
则当安排了前\(i\)个人,其中第一个队伍需要花费打饭的时间为\(j\),那么第二个队伍所需要的打饭时间就为\(S[i] - j\)。
于是有状态转移方程:
\(\qquad\qquad f[i][j] = \min\{ f[i][j], \max\{ f[i - 1][j - A[i]], j + B[i] \} \}\)
\(\qquad\qquad f[i][j] = \min\{ f[i][j], \max\{ f[i - 1][j], S[i] - j + B[i] \} \}\)
第一个转移方程表示将第\(i\)个人安排至第一个队伍,最后一个吃完饭的时刻即为原本最晚吃完的和现在第\(i\)个人吃完饭的时刻取\(\max\)。
第二个转移方程是将第\(i\)个人安排至第二个队伍,则不会对第一个队伍的打饭时间造成影响(依旧为\(j\)),取值同理。
\(f\)初始化为极大值,且\(f[0][0] = 0\)。
最后答案即\(\min\limits_{i = 0}^{S[n]}\{ f[n][i] \}\)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 210;
struct dd{
int x, y;
};
dd a[N];
int f[N][N * N], S[N];
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
inline int minn(int x, int y)
{
return x < y ? x : y;
}
inline int maxn(int x, int y)
{
return x > y ? x : y;
}
bool comp(dd x, dd y)
{
return x.y > y.y;
}
int main()
{
int i, j, n, m, mi = 1e9;
n = re();
for (i = 1; i <= n; i++)
{
a[i].x = re();
a[i].y = re();
}
sort(a + 1, a + n + 1, comp);
for (i = 1; i <= n; i++)
S[i] = S[i - 1] + a[i].x;
memset(f, 60, sizeof(f));
f[0][0] = 0;
for (i = 1; i <= n; i++)
for (j = 0, m = S[i]; j <= m; j++)
{
if (j >= a[i].x)
f[i][j] = minn(f[i][j], max(f[i - 1][j - a[i].x], j + a[i].y));
f[i][j] = minn(f[i][j], max(f[i - 1][j], S[i] - j + a[i].y));
}
for (i = 0; i <= S[n]; i++)
mi = minn(mi, f[n][i]);
printf("%d", mi);
return 0;
}
BZOJ1899或洛谷2577 [ZJOI2005]午餐的更多相关文章
- 洛谷 2577 [ZJOI2005]午餐——序列dp
题目:https://www.luogu.org/problemnew/show/P2577 可以从只有一个窗口的角度思考出一个贪心结论.就是应当按吃饭时间(不算打饭时间)从大到小排序.这样交换相邻两 ...
- [洛谷P2577] [ZJOI2005]午餐
洛谷题目链接:[ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的 ...
- 【题解】洛谷P2577 [ZJOI2005] 午餐(DP+贪心)
次元传送门:洛谷P2577 思路 首先贪心是必须的 我们能感性地理解出吃饭慢的必须先吃饭(结合一下生活) 因此我们可以先按吃饭时间从大到小排序 然后就能自然地想到用f[i][j][k]表示前i个人在第 ...
- 洛谷P2577 [ZJOI2005]午餐 打饭时间作为容量DP
P2577 [ZJOI2005]午餐 )逼着自己做DP 题意: 有n个人打饭,每个人都有打饭时间和吃饭时间.有两个打饭窗口,问如何安排可以使得总用时最少. 思路: 1)可以发现吃饭时间最长的要先打饭. ...
- 洛谷P2577 [ZJOI2005]午餐 dp
正解:序列dp 解题报告: 传送门! 这题首先要想到一个显然的贪心:每个窗口的排队顺序都是按照吃饭时间从大到小排序的 证明如下: 这种贪心通常都是用微扰法,这题也不例外 现在假如已经确定了每个窗口有哪 ...
- 洛谷 P2577 [ZJOI2005]午餐
这道题目比较难想. 题解: 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个人,在1号窗口打饭 ...
- 洛谷 P2577 [ZJOI2005]午餐 题解
每日一题 day56 打卡 Analysis 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个 ...
- 【洛谷2577】[ZJOI2005] 午餐(较水DP)
点此看题面 大致题意: 有\(N\)个学生去食堂打饭,每个学生有两个属性:打饭时间\(a_i\)和吃饭时间\(b_i\).现要求将这些学生分成两队分别打饭,求最早何时所有人吃完饭. 贪心 首先,依据贪 ...
- Luogu 2577[ZJOI2005]午餐 - 动态规划
Solution 啊... 我太菜了唔 不看题解是不可能的, 这辈子都不可能的. 首先一个队伍中排队轮到某个人的时间是递增的, 又要加上吃饭时间, 所以只能使吃饭时间递减, 才能满足最优,于是以吃饭时 ...
随机推荐
- h5+css 垂直导航菜单
http://blog.csdn.net/baidu_32731497/article/details/51814427
- property 、classmethod 、 staticmethod 的用法
@property # property是一个装饰器函数 ,作用:将一个方法伪装成属性 # 所有的装饰器函数都怎么用? 在函数.方法.类的上面一行直接@装饰器的名字 # 装饰器的分类: # 装饰函数 ...
- Python基础学习Day3 数据类型的转换、int、str、bool、字符串的常用方法、for循环
一.数据类型的转换 常用的是:int 转str.str转int.int转bool 时 非零即为 True . # 数据类型之间转换 ***** # int <--> str str(i ...
- java-学习7
数组的定义及使用 public class TestArr { public static void main(String[] args) { //声明数组 double array1[ ...
- go语言指针判等
https://blog.csdn.net/qq_26981997/article/details/52608081
- MATLAB二维相机标定的解决方案 calibration
第一步,在命令行下面输入cameraCalibrator,启动MATLAB相机标定.相机矫正界面 cameraCalibrator 第二步:拍照.如果你是做相机标定,你应该知道,你需要一些calibr ...
- 10.18号java课后动手动脑
问题一结论:类如果提供了一个自定义的构造方法,将导致系统不再提供默认构造方法. 问题二结论:(1)程序运行的结果是100和300,field=200为类的初始化块,可以在类中使用“{”和“}”将语句包 ...
- mysql ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log. 一般可通 ...
- CentOS6编译安装php5.3
一.CentOS6编译安装php5.3 1.安装扩展 yum install -y openssl-devel traceroute libtool unzip gcc gcc-c++ autocon ...
- 激活 pycharm
step1: 在本地 hosts 文件增加一行,windows 路径一般为:C:\Windows\System32\drivers\etc step2: 输入激活码 7SPIY8PDT7-eyJsaW ...