nyoj 题目914 Yougth的最大化
Yougth的最大化
时间限制:
1000 ms | 内存限制:
65535 KB 时间限制: 1000 ms | 内存限制: 65535 KB
难度:
4 难度: 4
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,说明单位价值还可以更大,在mid~last区间; //sum<0,说明单位价值比mid小,在top~mid区间 } 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);//可以不排序,但是r要为物品中最大的单位价值 double l=0,r=a[n-1].s ; while(r-l>0.00001)//如果为int型,应是l<=r { double mid = (l+r)/2; if(judge(mid)) l=mid; else r=mid; } printf("%.2lf ",l);//注意:在类似疯牛一题中输出是L-1 } return 0; }
下一篇:
十大经典排序算法 (一)