6349: Talent Show

时间限制: 1 Sec  内存限制: 128 MB
提交: 106  解决: 40
[提交] [状态] [讨论版] [命题人:admin]

题目描述

Farmer John is bringing his N cows, conveniently numbered 1…N, to the county fair, to compete in the annual bovine talent show! His ith cow has a weight wiwi and talent level ti, both integers.
Upon arrival, Farmer John is quite surprised by the new rules for this year's talent show:

(i) A group of cows of total weight at least W must be entered into the show (in order to ensure strong teams of cows are competing, not just strong individuals), and

(ii) The group with the largest ratio of total talent to total weight shall win.

FJ observes that all of his cows together have weight at least W, so he should be able to enter a team satisfying (i). Help him determine the optimal ratio of talent to weight he can achieve for any such team.

输入

The first line of input contains N (1≤N≤250) and W (1≤W≤1000). The next N lines each describe a cow using two integers wi (1≤wi≤106) and ti (1≤ti≤103).

输出

Please determine the largest possible ratio of total talent over total weight Farmer John can achieve using a group of cows of total weight at least W. If your answer is A, please print out the floor of 1000A in order to keep the output integer-valued (the floor operation discards any fractional part by rounding down to an integer, if the number in question is not already an integer).

样例输入

3 15
20 21
10 11
30 31

样例输出

1066

提示

In this example, the best talent-to-weight ratio overall would be to use just the single cow with talent 11 and weight 10, but since we need at least 15 units of weight, the optimal solution ends up being to use this cow plus the cow with talent 21 and weight 20. This gives a talent-to-weight ratio of (11+21)/(10+20) = 32/30 = 1.0666666..., which when multiplied by 1000 and floored gives 1066.

观察ti和wi和.设sum(ti)/sum(wi) = x.则有sum(ti) = sum(wi)*x. 进一步得出sum(ti)-sum(wi)*x = 0.展开后利用加法交换律得到sum(ti-wi*x) = 0. 此时发现ti,wi可以枚举,只留下x不确定,然后结果要求是0。考虑二分x,若加起来的和>0,说明x的值小了,若加起来的和<0,说明x大了,然后考虑到和的问题。

求和的问题明显可以看作是0-1背包问题,即dp[i]表示重量为i的情况下,可获得的最大值。然后发现此时的背包容量可以是特别大,而没有具体值,将重量大于W之后的值都当作W看待。对于dp[W],若他大于等于0,说明mid小了,否则说明mid大了。

再者0-1背包的过程中,由于背包的容量没有上限,所以背包的权值可以是在0到W+wi,所以二维dp维护的过程中可以将j-wi变成j+wi。,然后再进行背包。

最后得到结果,为了方便计算,可以在开始的时候就将ti*1000,即被除数扩大1000倍,这样结果自然扩大了1000倍,用long long计算,解决了向下取整的问题。

注:二分时,if成立,则需要向下取整,即ans=mid;否则,ans=mid-1.

AC代码:

#include <bits/stdc++.h>
using namespace std;
#define N 300
#define ll long long
#define inf 1LL<<60
int n,m,t[N],w[N];
ll dp[1200];
bool jud(int mid)
{
for(int i=1; i<=m; ++i)
{
dp[i]=-inf;
}
for(int i=1; i<=n; ++i)
{
ll v=t[i]-(ll)w[i]*mid;
for(int j=m; j>=0; --j)
{
if(dp[j]==-inf)
{
continue;
}
int jj=j+w[i];
if(jj>m)
{
jj=m;
}
dp[jj]=max(dp[jj],dp[j]+v);
}
}
return dp[m]>=0;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1; i<=n; ++i)
{
scanf("%d %d",&w[i],&t[i]);
t[i]*=1000;
}
int l=0,r=1000000;
while(l<=r)
{
int mid=(l+r)/2;
if(jud(mid))
{
l=mid+1;
}
else
{
r=mid-1;
}
}
printf("%d\n",r);
return 0;
}

Talent Show的更多相关文章

  1. Backbone,Marionette,Talent学习笔记

    具体以源码为准 Talent继承自Marionette继承自BackBone Region: 继承自Backbone.Event,show(view)会调用view.render(),然后$el.ap ...

  2. 1062 Talent and Virtue (25)

    /* L (>=60), the lower bound of the qualified grades -- that is, only the ones whose grades of ta ...

  3. pat 1062. Talent and Virtue (25)

    难得的一次ac 题目意思直接,方法就是对virtue talent得分进行判断其归属类型,用0 1 2 3 4 表示 不合格 sage noblemen foolmen foolmen 再对序列进行排 ...

  4. PAT-B 1015. 德才论(同PAT 1062. Talent and Virtue)

    1. 在排序的过程中,注意边界的处理(小于.小于等于) 2. 对于B-level,这题是比較麻烦一些了. 源代码: #include <cstdio> #include <vecto ...

  5. 分数规划模板(洛谷P4377 [USACO18OPEN]Talent Show)(分数规划,二分答案,背包)

    分数规划是这样一个东西: 给定若干元素,每个元素有两个属性值\(a_i,b_i\),在满足题目要求的某些限制下选择若干元素并求出\(\frac{\sum a}{\sum b}\)的最大值. 如果没有限 ...

  6. 1062.Talent and Virtue

    About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about ...

  7. Cocos2d-X开发教程-捕鱼达人 Cocos2-x development tutorial - fishing talent

    Cocos2d-X开发教程-捕鱼达人 Cocos2-x development tutorial - fishing talent 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱 ...

  8. BZOJ 5281--[Usaco2018 Open]Talent Show(分数规划&单调队列&DP)

    5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 79  Solved: 58[Sub ...

  9. 【BZOJ5281】Talent Show(分数规划)

    [BZOJ5281]Talent Show(分数规划) 题面 BZOJ 洛谷 题解 二分答案直接就是裸的分数规划,直接跑背包判断是否可行即可. #include<iostream> #in ...

  10. 1062 Talent and Virtue (25 分)

    1062 Talent and Virtue (25 分) About 900 years ago, a Chinese philosopher Sima Guang wrote a history ...

随机推荐

  1. Git入门 时光穿梭鸡 版本回退 工作区 暂存区

    分布式集中式 CVS及SVN都是集中式的版本控制系统 , 而Git是分布式版本控制系统 集中式版本控制系统,版本库是集中存放在中央服务器的, 而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得 ...

  2. HDU2874【LCA(模板)】

    第一题LCA,代码参考自:Ice_Crazy 思路: 这个最短路算法是想都别想了,可以看出这幅图就是树嘛,那么对于查询就是求树上两个结点最短距离. 这里就是利用LCA的tarjan离线算法. 算法的大 ...

  3. 3dmax切割平行线

    1 选择物体(可编辑多边形),选择边 ,然后点击切片平面 2 然后会出现黄色线框 3 移动旋转黄色线框到合适位置,然后点切片 4 结果

  4. [Xcode 实际操作]七、文件与数据-(9)编码创建Plist文件(属性列表文件)

    目录:[Swift]Xcode实际操作 本文将演示如何通过编码的方式,创建属性列表文件. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit ...

  5. [Xcode 实际操作]七、文件与数据-(4 )遍历文件夹中的文件

    目录:[Swift]Xcode实际操作 本文将演示如何遍历文件夹下的内容. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class V ...

  6. echarts3.0 实例容器不实时更新页面的问题

    var instanceId = document.getElementById(option.echartId).getAttribute('_echarts3_instance_'); if (i ...

  7. 11.Python初窥门径(函数名,可迭代对象,迭代器)

    Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...

  8. jquery.jscrollpane.js滚动速度设置

    首先找到插件里面的这个函数,改变成下面的样子: function initMousewheel() { container.unbind(mwEvent).bind( mwEvent, functio ...

  9. 2017浙江工业大学-校赛决赛 BugZhu抽抽抽!!

    Description 当前正火的一款手游阴阳师又出新式神了,BugZhu十分想要获得新出的式神,所以他决定花光所有的积蓄来抽抽抽!BugZhu经过长时间的研究后发现通过画三角外接圆能够提高获得该式神 ...

  10. Uva1377

    /* 在n个刻度和他们的差里挑不超过7个刻度,0是固定的,最大的刻度肯定是最大值,然后剩下的dfs挑. */ #include<bits/stdc++.h> #define inf 0x3 ...