题解 P2577 【[ZJOI2005]午餐】
Solution [ZJOI2005]午餐
题目大意:每个人有一个打饭时间和吃饭时间,求把所有人分到两个队伍,所有人都吃完饭的最短时间
分析:既然每个人有一个吃饭时间和打饭时间,我们可以大胆猜想,让吃的慢的人先打饭
我有一个比较迷的证明,不知道对不对……
假如只有一个队列,设打饭时间为\(A\),吃饭时间为\(B\)
\(ans = max\{\sum_{j = 1}^{i}A_j+B_i \quad | \quad 1 \in [1,n]\}\)
假如有两个人编号\(1\),\(2\)
第一种情况:\(ans_1 = max\{A_1+B_1,A_1+A_2+B_2\}=A_1+A_2+B_2\)
第二种情况:\(ans_2 = max\{A_2 + B_2,A_1 + A_2 + B_1\} = A_1 + A_2 + B_1\)
假如第一种情况更优:\(ans_1 < ans_2 \implies B_2 < B_1\)
所以我们按照\(B\)值降序排列可以使答案最优,然后我们考虑\(dp\)
设\(f[i][j][k]\)表示前\(i\)个人,第\(1\)个队列的打饭时间之和为\(j\),第\(2\)个队列的打饭时间为\(k\)的最优答案,转移显然,数组会爆
我们发现第\(3\)维可以略去,因为我们知道\(\sum_1^iA_i\),以及第一个队列的\(\sum A\),我们就可以算出第二个队列的\(\sum A\),这个有点像方格取数的优化
然后\(f[i][j] = \begin{cases} max \{f[i-1][j - A_i],j + B_i\} \quad j \geq A_i \\ max\{f[i-1][j],\sum_{j=1}^iA_j-j+B_i\} \end{cases}\)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 201;
struct Person{
int A,B;
bool operator < (const Person &rhs)const{
return B > rhs.B;
}
}person[maxn];
int n,ans = 0x7fffffff,sum,f[maxn][40001];
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++)
scanf("%d %d",&person[i].A,&person[i].B);
sort(person + 1,person + 1 + n);
memset(f,0x3f,sizeof(f));
f[0][0] = 0;
for(int i = 1;i <= n;i++){
sum += person[i].A;
for(int j = 0;j <= sum;j++){
if(j >= person[i].A)f[i][j] = min(f[i][j],max(f[i - 1][j - person[i].A],j + person[i].B));
f[i][j] = min(f[i][j],max(f[i - 1][j],sum - j + person[i].B));
}
}
for(int i = 0;i <= sum;i++)ans = min(ans,f[n][i]);
printf("%d\n",ans);
return 0;
}
原文地址:https://www.cnblogs.com/colazcy/p/11545410.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- tf_cnn_benchmark 显存问题
- Spark on Kubernetes PodTemplate 的配置
- IO ports
- 【android系统】使用s3来上传下载文件
- 【Spark on Kubernetes】Executor环境变量
- Python获取字典值
- 应用程序InetlliJ IDEA不能打开
- yum install空间不足
- prometheus-nginxlog-exporter构建Nginx日志监控
- s3cmd put文件的过程
- Ceph RGW配置Nginx代理出现S3Error: 403 (Forbidden)
- OmniDiskSweeper清理系统文件
- 【Kubernetes】通过ConfigMap修改容器的DNS
- 【Tensorflow 2.x】检验MKL
- kubernetes dashboard insecure配置