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 ...
随机推荐
- MATLAB循环结构:while语句P69范数待编
while语句的一般格式为: while 条件 循环体语句 end 从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们的和. 程序如下: sum=; n=; x=input('输入一个数字 ...
- 被学长教会的高斯消元法Gauss
昨天学长教了我高斯消元法. 这里用一个栗子来模拟一下Gauss的流程. 真的通俗易懂!这里是洛谷题目链接. 这就是例子 x-2y+3z= 4x-5y+6z= 7x-8y+10z= 先将它转化为矩阵 - ...
- sap ftp 处理
[转] SAP FTP Function 本文示例如何使用SAP FTP Function将文件从应用服务器传输到另外一个FTP服务器上. DATA: BEGIN OF ig_ftp_result O ...
- swap 内存不足
参考:https://stackoverflow.com/questions/5682854/why-is-the-linker-terminating-on-me-when-i-build-clan ...
- linux -unrar解压缩
解压缩命令unrar的使用: $unrar --help 用法: unrar <command>-<switch 1> -<switchN> <arch ...
- mysql主从复制(linux下)
转至:http://369369.blog.51cto.com/319630/790921 怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作: 1. ...
- 高性能javascript学习总结(2)--DOM编程
我们知道,对DOM的操作都是非常的耗性能的,那么为什么会耗性能呢? 文档对象模型(DOM)是一个独立于语言的,使用 XML和 HTML 文档操作的应用程序接口(API).在浏览器中,主要与 ...
- 练习题目 :if for while else range、xrange、zip
range在内存中直接生成指定的序列,当序列非常大时会浪费内存资源: xrange则不会直接生成一个list,而是每次调用返回其中的一个值,而非直接全部生成存于内存中 range([start,] s ...
- Linux 上通过rpm安装mysql
安装mysql之前要remove掉系统自带的mysql: rpm -qa | grep "MySQL*" 和rpm -qa | grep mysql 要确保卸载干净 rpm ...
- fastjson 格式化自定义选项
QuoteFieldNames———-输出key时是否使用双引号,默认为true WriteMapNullValue——–是否输出值为null的字段,默认为false WriteNullNumberA ...