nyoj--914--Yougth的最大化(二分查找)
Yougth的最大化
时间限制:1000 ms | 内存限制:65535 KB
难度:4
- 描述
-
Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗?
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define MAX 10010 double b[MAX]; int n,k; struct node { int w,v; }q[MAX]; int judge(double x) { for(int i=0;i<n;i++) b[i]=q[i].v-x*q[i].w; //这一步比较巧妙,假设当前这个就是平均的价值,然后看每一个的差价 sort(b,b+n); double sum=0; for(int i=0;i<k;i++) sum+=b[n-i-1]; return sum>=0; } int main() { while(scanf("%d%d",&n,&k)!=EOF) { for(int i=0;i<n;i++) scanf("%d%d",&q[i].w,&q[i].v); double l=0,r=10000000,mid; while(r-l>1e-10) { mid=(l+r)/2; if(judge(mid)) l=mid; else r=mid; } printf("%.2f\n",l); } return 0; }