BZOJ5281:[Usaco2018 Open]Talent Show
我对二分的理解:https://www.cnblogs.com/AKMer/p/9737477.html
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5281
题目要求我们最大化\(\frac{\sum{t_i}}{\sum{w_i}}\),我们可以二分它的值\(x\)。如果存在某一种方案使得\(\frac{\sum{t_i}}{\sum{w_i}}>=x\)
,我们可以将其转化成有一种方案满足\(\sum{t_i}-\sum{w_i*x}>=0\)。于是乎我们就可以将\(t_i-w_i*x\)作为一只奶牛的权值,体重为空间来做背包,判断是否可以用\(W\)的体积背出大于等于\(0\)的权值。而且显然,\(t_i-w_i*x\)大于等于\(0\)的奶牛肯定会被选中,那么如果需要用到\(t_i-w_i*x\)为负数的奶牛,肯定是尽量少选。所以我们在背包时,如果从某个状态转以后体积大于\(W\)了,就可以停下转移了,因为再加也没用了。
时间复杂度:\(O(log1e9*n*W)\)
空间复杂度:\(O(n)\)
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
const double eps=1e-6,inf=1e9;
int n,W;
int w[255],t[255];
double now[255],f[1005];
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
bool check(double limit) {
for(int i=1;i<=n;i++)
now[i]=1.0*t[i]-limit*w[i];//更改权值
for(int i=1;i<=W;i++)f[i]=-inf;
for(int i=1;i<=n;i++) {
for(int j=W;j>=W-w[i]&&~j;j--)
f[W]=max(f[W],f[j]+now[i]);//转移后大于W的只转移一次
for(int j=W-1;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+now[i]);//背包
}
return f[W]>eps;
}
int main() {
n=read(),W=read();
for(int i=1;i<=n;i++)
w[i]=read(),t[i]=read();
double l=0,r=1e3;
while(l+eps<r) {
double mid=(l+r)/2;
if(check(mid))l=mid;//二分x,[0,l]都是可以凑出来的值
else r=mid;
}
printf("%d\n",(int)(l*1000));//l是最大的那一个
return 0;
}
BZOJ5281:[Usaco2018 Open]Talent Show的更多相关文章
- BZOJ5281: [Usaco2018 Open]Talent Show(01分数规划&DP)
5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 166 Solved: 124[S ...
- BZOJ5281: [Usaco2018 Open]Talent Show 01分数规划+01背包
Description FarmerJohn要带着他的N头奶牛,方便起见编号为1…N,到农业展览会上去,参加每年的达牛秀!他的第i头奶牛重 量为wi,才艺水平为ti,两者都是整数.在到达时,Farme ...
- bzoj 5281 [Usaco2018 Open]Talent Show——0/1分数规划
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5281 把分子乘1000,就能在整数里做了. 这种水题也花了这么久…… #include< ...
- [Usaco2018 Open]Talent Show
Description FarmerJohn要带着他的N头奶牛,方便起见编号为1-N,到农业展览会上去,参加每年的达牛秀!他的第i头奶牛重量为wi,才艺水平为ti,两者都是整数.在到达时,Farmer ...
- bzoj 5281: [Usaco2018 Open]Talent Show【dp】
注意到sum_t比较小,所以设f[i][j]为选前i头牛,当前sum_t为j的最小sum_w值,转移是f[i][j]=min(f[i-1][j],f[i-1][j-t[i]]+w[i]),然后i维用滚 ...
- BZOJ 5281--[Usaco2018 Open]Talent Show(分数规划&单调队列&DP)
5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 79 Solved: 58[Sub ...
- vijos 1563 疯狂的方格取数
P1653疯狂的方格取数 Accepted 标签:天才的talent[显示标签] 背景 Due to the talent of talent123,当talent123做完NOIP考了两次的二取 ...
- 01分数规划初探?!By cellur925
都要\(NOIp\)了为啥我还在看这种玄学玩意..... \(01\)分数规划:这是一个问题模型\(qwq\),一般是在求\[\frac{\sum_{i=1}^{n} a_i*x_i}{\sum_{i ...
- java web 开发三剑客 -------电子书
Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知In ...
随机推荐
- 九度OJ 1198:a+b (大数运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6745 解决:2320 题目描述: 实现一个加法器,使其能够输出a+b的值. 输入: 输入包括两个数a和b,其中a和b的位数不超过1000位 ...
- Random Fourier Features
K-DSN 深度堆叠网络 Random Features for Large-Scale Kernel Machines To accelerate the training of kernel ma ...
- 【python】-- 字符串、字符编码与转码
字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可:访问子字符串,可以使用方括号来截取字符串: var1 ...
- Linux中源码包安装
1.准备环境 a.因为是编译安装,所以需要安装gcc编译器 b.下载源码包 2.注意事项 a.源代码保存位置 /usr/local/src/ b.软件安装位置 /usr/local/ c.如何确定安装 ...
- 18.Django原生SQL语句查询返回字典
在django中执行自定义语句的时候,返回的结果是一个tuple ,并我不是我所期望的dict.当结果是tuple 时,如果要取得数据,必须知道对应数据在结果集中的序号,用序号的方式去得到值. 如果是 ...
- TensorFlow 初级教程(三)
TensorFlow基本操作 import os import tensorflow as tf os.environ[' # 使用TensorFlow输出Hello # 创建一个常量操作( Cons ...
- 2014阿里实习生面试题——MySQL如何实现索引的
这是2014阿里实习生北京站二面的一道试题: 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,比如MyISAM和InnoDB存储引擎. MyISAM索引实现: MyI ...
- shell 日期加减运算
比如今日是2012-04-22 $ date -d "+1 day" +%Y-%m-%d 2012-04-23 $ date -d "-1 day" +%Y ...
- LeetCode:区域和检索【303】
LeetCode:区域和检索[303] 题目描述 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点. 示例: 给定 nums = [ ...
- HDU - 1114 Piggy-Bank 【完全背包】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1114 题意 给出一个储钱罐 不知道里面有多少钱 但是可以通过重量来判断 先给出空储钱罐的重量 再给出装 ...