Yougth的最大化
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗?
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,k;
struct node{
int w,v;
double s;
}a[10005];
double b[10005];
int cmp(node a,node b){
return a.s < b.s ;
}
int judge(double mid){
for(int i=0;i<n;i++)
{
b[i]=a[i].v -a[i].w *mid;
}
sort(b,b+n);
double sum=0;
for(int i=n-1;i>=n-k;i--){//从价值大的开始选择
sum+=b[i];
}
return sum>=0?1:0;//sum>0,说明单位价值还可以更大,在mid~last区间;
//sum<0,说明单位价值比mid小,在top~mid区间
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
for(int i=0;i<n;i++)
{
scanf("%d%d",&a[i].w,&a[i].v);
a[i].s = a[i].v /a[i].w ;
}
sort(a,a+n,cmp);//可以不排序,但是r要为物品中最大的单位价值
double l=0,r=a[n-1].s ;
while(r-l>0.00001)//如果为int型,应是l<=r
{
double mid = (l+r)/2;
if(judge(mid))
l=mid;
else
r=mid;
}
printf("%.2lf\n",l);//注意:在类似疯牛一题中输出是L-1
}
return 0;
}