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> #define Max 10050 using namespace std; double w[Max],v[Max],t[Max]; int n,k; int judge(double x) { double l=x,sum; for(int i=0;i<n;i++) { t[i]=v[i]-l*w[i]; } sort(t,t+n); sum=0; for(int i=0;i<k;i++) { sum+=t[n-i-1]; } return sum>=0; } double getanswer(double x,double y) { double l=y,r=x,mid; while(r-l>0.001) { mid=(l+r)/2; if(judge(mid)) { l=mid; } else r=mid; } return mid; } int main() { double max,min; while(scanf("%d%d",&n,&k)!=EOF) { max=0; min=10000000; for(int i=0;i<n;i++) { scanf("%lf%lf",&w[i],&v[i]); if(v[i]/w[i]>max) max=v[i]/w[i]; if(v[i]/w[i]<min) min=v[i]/w[i]; } printf("%.2f\n",getanswer(max,min)); } }
-
有多组测试数据