5281: [Usaco2018 Open]Talent Show

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 79  Solved: 58
[Submit][Status][Discuss]

Description

FarmerJohn要带着他的N头奶牛,方便起见编号为1…N,到农业展览会上去,参加每年的达牛秀!他的第i头奶牛重量为wi,才艺水平为ti,两者都是整数。在到达时,FarmerJohn就被今年达牛秀的新规则吓到了:
 
(一)参加比赛的一组奶牛必须总重量至少为W
 
(这是为了确保是强大的队伍在比赛,而不仅是强大的某头奶牛),并且
 
(二)总才艺值与总重量的比值最大的一组获得胜利。
 
FJ注意到他的所有奶牛的总重量不小于W,所以他能够派出符合规则(一)的队伍。帮助他确定这样的队伍中能够达到的最佳的才艺与重量的比值。
 

Input

输入的第一行包含N和W。下面N行,每行用两个整数wi和ti描述了一头奶牛。
1≤N≤250
1≤W≤1000
1≤wi≤10^6
1≤ti≤10^3
 

Output

请求出Farmer用一组总重量最少为W的奶牛最大可能达到的总才艺值与总重量的比值。
如果你的答案是A,输出1000A向下取整的值,以使得输出是整数
(当问题中的数不是一个整数的时候,向下取整操作在向下舍入到整数的时候去除所有小数部分)。
 

Sample Input

3 15
20 21
10 11
30 31

Sample Output

1066
在这个例子中,总体来看最佳的才艺与重量的比值应该是仅用一头才艺值为11、重量为10的奶牛,但是由于我们需
要至少15单位的重量,最优解最终为使用这头奶牛加上才艺值为21、重量为20的奶牛。这样的话才艺与重量的比值
为(11+21)/(10+20)=32/30=1.0666666...,乘以1000向下取整之后得到1066。
 

题目链接:

    http://www.lydsy.com/JudgeOnline/problem.php?id=5281

Solution

  一看题面就知道要01分数规划。。。

  假设答案为c,式子比较显然 ti的总和 / wi的总和 >= c

  ti的总和 >=  wi的总和 * c

  然后就是二分c验证正确性。。

  将每只牛的价值赋值为 ti - wi * c

  显然如果有一种方案使得总的牛的价值不小于0,就说明c存在合法方案。。

  由于W<=1000,我们可以直接DP。。

  f [ i ] 表示wi总和不小于i时的最大价值总和。。

  f [ i ] = max(f[j]+val)其中val表示当前牛的价值,并且i-j<=w

  由于i和j的关系,要用单调队列维护。。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<cmath>
#include<set>
#define pa pair<LL,LL>
#define LL long long
#define ept 1e-5
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void Out(int a){
if(a>9) Out(a/10);
putchar(a%10+'0');
}
const double inf=1e9;
const LL mod=1e9+7;
const int N=300;
int n,m,cnt=1,W;
struct cow{
int w,s;
}a[N];
double f[2000],t[2000];
int q[2000]; int main(){
n=read();W=read();
for(int i=1;i<=n;++i){
a[i].w=read();a[i].s=read();
}
double l=0,r=10000,mid,y;
int x,L=1,R=0;
while(fabs(r-l)>ept){
//cout<<l<<" "<<r<<endl;
mid=(l+r)/2;
for(int i=0;i<=W;++i) f[i]=-inf;
f[0]=0;
for(int i=1;i<=n;++i){
x=a[i].w<=W?a[i].w:W;
y=(double)a[i].s-(double)mid*(double)a[i].w;
L=1;R=1;q[1]=0;
for(int j=1;j<=W;++j){
while(L<=R&&f[j]>f[q[R]]) --R;
q[++R]=j;
while(j-q[L]>x) ++L;
t[j]=f[q[L]]+y;
}
for(int j=1;j<=W;++j)
if(t[j]>f[j]) f[j]=t[j];
}
if(f[W]>=0) l=mid;
else r=mid;
}
l=l*1000;
int ans=l;
printf("%d\n",ans);
return 0;
}

  

  

This passage is made by Iscream-2001.

BZOJ 5281--[Usaco2018 Open]Talent Show(分数规划&单调队列&DP)的更多相关文章

  1. BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列

    BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的 ...

  2. P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表

    P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...

  3. BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)

    题目链接 \(Description\) 每个点有费用si与价值pi,要求选一些带根的连通块,总大小为k,使得 \(\frac{∑pi}{∑si}\) 最大 \(Solution\) 01分数规划,然 ...

  4. [BZOJ4476][JSOI2015]送礼物[分数规划+单调队列]

    题意 题目链接 分析 分数规划之后可以得到式子:\(max-min-r*mid+l*mid\geq k*mid\) . 贪心选择,肯定区间的端点是极小或者极大值.特殊处理区间长度 \(\leq L\) ...

  5. 【BZOJ3316】JC loves Mkk 分数规划+单调队列

    [BZOJ3316]JC loves Mkk Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整 ...

  6. bzoj 5281 [Usaco2018 Open]Talent Show——0/1分数规划

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5281 把分子乘1000,就能在整数里做了. 这种水题也花了这么久…… #include< ...

  7. 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维用滚 ...

  8. 【BZOJ 3316】JC loves Mkk 01分数规划+单调队列

    单调栈不断吞入数据维护最值,数据具有单调性但不保证位置为其排名,同时可以按照进入顺序找出临近较值单调队列队列两端均可删除数据但只有队末可以加入数据,仍然不断吞入数据但同时可以额外刨除一些不符合条件的数 ...

  9. BZOJ4476 JSOI2015送礼物(分数规划+单调队列)

    看到这个式子当然先二分答案.得max-min-(j-i+k)ans>=0. 显然max-min相同的情况下所选区间长度越短越好,所以max和min都应该取在边界.那么实际上我们根本不用管端点是否 ...

随机推荐

  1. OneZero第三周第二次站立会议(2016.4.5)

    1. 时间: 13:00--13:15  共计15分钟. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http ...

  2. 导入mysql报错问题

    今天数据导入报错:Got a packet bigger than‘max_allowed_packet’bytes的问题 2个解决方法: 1.临时修改:mysql>set global max ...

  3. 821. Shortest Distance to a Character

    class Solution { public: vector<int> shortestToChar(string S, char C) { int len=S.length(); ve ...

  4. 2018.11.07 NOIP训练 L的鞋子(权值分块+莫队)

    传送门 乱搞题. 我直接对权值分块+莫队水过了. 不过调了30min30min30min发现ststst表挂了是真的不想说什么233. 代码

  5. 关于redis,学会这9点就够了

    一.redis是什么 redis是一种支持Key-Value等多种数据结构的存储系统.可用于缓存.事件发布或订阅.高速队列等场景.该数据库使用ANSI C语言编写,支持网络,提供字符串.哈希.列表.队 ...

  6. Educational Codeforces Round 54 E. Vasya and a Tree(树上差分数组)

    https://codeforces.com/contest/1076/problem/E 题意 给一棵树(n<=3e5),m(3e5)次查询,每次查询u,d,x,表示在u的子树中,给距离u&l ...

  7. Win7 VS2013环境编译boost1_58_0

    备忘,发现好多不常用的东西不记笔记再想用要重新花时间找,所以试着开始记笔记,写入博客吧. 首先去官网下最新的版本 http://www.boost.org/ 写本文时boost最新版本为1_58_0, ...

  8. HTML上传文件支持大文件上传,下载

    上传 1.修改配置文件web.config,在<system.webServer>下面加入 <security> <requestFiltering > <r ...

  9. 开源HIS之C/S选型

    客户端/服务的形式是我中爱的,我认可只有这样软件跑起来不会失控.因为你不知道每一个程序员是否足够清醒.但一开始我说过要从基本的应急的门诊收费开始,所以我并不打算一启动就写一个服务,并为之选型:TCP/ ...

  10. info AI drive

    Who we look for Here at comma, we don't care about the source of your education or your traditional ...