Yougth的最大化
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗?
-
输入
-
有多组测试数据
每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi。
(1<=k=n<=10000) (1<=Wi,Vi<=1000000)
输出
- 输出使得单位价值的最大值。(保留两位小数) 样例输入
-
3 2 2 2 5 3 2 1
样例输出
-
0.75
#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代表富裕,可以扩大;=0代表所选刚刚好;<0则是达不到
}
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);
double l=0,r=a[n-1].s ;//所选价值一定小于等于单品最大价值且大于零
while(r-l>0.00001)//double型判断 ,二分
{
double mid = (l+r)/2;
if(judge(mid))
l=mid;
else
r=mid;
}
printf("%.2lf\n",l);
}
return 0;
}