题目描述:
有n个物品的重量和价值分别是 wi 和 vi。从中选出k个物品使得单位重量的价值最大。
输入格式:
第一行输入两个整数 n,k
第二行输入n个整数wi
第三行输入n个整数vi
输出格式:
输出一个浮点数,保留两位小数
样例输入:
3 2
2 5 2
2 3 1
样例输出:
0.75
#include<bits/stdc++.h>
using namespace std;
#define maxn 10010
double w[maxn],v[maxn],c[maxn];
int n,k;
bool ok(double ans)
{
for(int i=0;i<n;i++)
c[i]=v[i]-ans*w[i];
sort(c,c+n);
double cnt=0;
for(int i=0;i<k;i++)
cnt+=c[n-1-i];
return cnt>=0;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%lf",&w[i]);
for(int i=0;i<n;i++)
scanf("%lf",&v[i]);
double l=0,r=1000010;
while(abs(l-r)>1e-6)
{
double mid=(l+r)/2;
if(ok(mid))
l=mid;
else
r=mid;
}
printf("%.2lf\n",r);
return 0;
}