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
分析:k个物品单位重量的最大价值一定不会超过单个物品单位价值的最大值,且一定不小于0,这样我们就求出了最终答案所在的区间。然后利用二分压缩区间,直到求出最终结果。
#include<stdio.h> #include<algorithm> using namespace std; #define eps 1e-4 const int N = 10005; double w[N], v[N], x[N], max_ave; int n, k; bool judge(double a) { for(int i = 0; i < n; i++) x[i] = v[i] - a * w[i]; sort(x, x+n); double sum = 0; for(int i = 0; i < k; i++) sum += x[n-1-i]; return sum >= 0 ? true : false; } double get_ans() { double l = 0, r = max_ave; while(r - l > eps) { double mid = (l + r) / 2; if(judge(mid)) l = mid; else r = mid; } return l; } int main() { while(~scanf("%d%d",&n,&k)) { max_ave = 0; for(int i = 0; i < n; i++) { scanf("%lf%lf",&w[i],&v[i]); double tmp = v[i] / w[i]; max_ave = max(max_ave, tmp); } printf("%.2lf\n",get_ans()); } return 0; }
-
有多组测试数据