链接:https://www.nowcoder.com/acm/contest/93/I
来源:牛客网
时间限制:C/C++ 5秒,其他语言10秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
wyh学长现在手里有n个物品,这n个物品的重量和价值都告诉你,然后现在让你从中选取k个,问你在所有可能选取的方案中,最大的单位价值为多少(单位价值为选取的k个物品的总价值和总重量的比值)
输入描述:
输入第一行一个整数T(1<=T<=10) 接下来有T组测试数据,对于每组测试数据,第一行输入两个数n和k(1<=k<=n<=100000) 接下来有n行,每行两个是a和b,代表这个物品的重量和价值
输出描述:
对于每组测试数据,输出对应答案,结果保留两位小数
示例1
输入
1 3 2 2 2 5 3 2 1
输出
0.75
说明
对于样例来说,我们选择第一个物品和第三个物品,达到最优目的
PS:类似于最优比例生成树。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
struct node{
double x,y;
}a[maxn];
double l,r,mid;
int n,k;
int cmp(node a,node b)
{
return a.y-a.x*mid>b.y-b.x*mid;
}
bool check()
{
double c=0;
for(int i=0;i<k;i++)
c+=a[i].y-a[i].x*mid;
if(c>=0)
return 1;
return 0;
}
double solve()
{
while(abs(l-r)>1e-4)
{
mid=(l+r)/2;
sort(a,a+n,cmp);
if(check())
l=mid;
else
r=mid;
}
return l;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>k;
l=r=0;
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
if(a[i].y/a[i].x>r)
r=a[i].y/a[i].x;
}
printf("%.2f\n",solve());
}
return 0;
}