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
来源
- Yougth 上传者
-
TC_杨闯亮
#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #define eps 1e-6 using namespace std; struct Node{ double w,v; }A[10010]; int N,K; double MAX(double a,double b){ return a>b?a:b; } double num[10010]; bool cmp(double a,double b){ return a>b; } bool judge(double mid){ for(int i=0;i<N;++i){ num[i]=A[i].v-A[i].w*mid; } sort(num,num+N,cmp); double sum=0; for(int i=0;i<K;++i){ sum+=num[i]; } return sum>=0; } int main() { int i,j; while(scanf("%d%d",&N,&K)==2){ double r=0; for(i=0;i<N;++i){ scanf("%lf%lf",&A[i].w,&A[i].v); r=MAX(r,A[i].v/A[i].w); } double l=0; while(eps<r-l){ double mid=(l+r)/2.0; if(judge(mid)) l=mid; else r=mid; } printf("%.2lf\n",l); } return 0; }
-
有多组测试数据