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<string.h> #include<algorithm> #define N 10010 #define E 1e-6 using namespace std; double b[N]; int n,k; struct zz { int w; int v; }q[N<<1]; 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) { double ma=0; for(int i=0;i<n;i++) { scanf("%d%d",&q[i].w,&q[i].v); double cmp=q[i].v/q[i].w; if(cmp>ma) ma=cmp; } double l=0,r=0x3f3f3f,mid; while(r-l>E) { mid=(l+r)/2; if(judge(mid)) l=mid; else r=mid; } printf("%.2lf\n",l); } return 0; }