最大化平均值 (二分查找)

有n个物品的重量和价值分别是wi和vi。从中选出k个物品使得单位重量的价值最大。 1<=k<=n<=10^4     1<=wi,vi<=10^6

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<string.h>
 4 #include<algorithm>
 5 #include<math.h>
 6 #include<stdbool.h>
 7 #include<time.h>
 8 #include<stdlib.h>
 9 #include<map>
10 #include<stack>
11 #include<queue>
12 #include<vector>
13 using namespace std;
14 #define clr(x,y)    memset(x,y,sizeof(x))
15 #define sqr(x)      ((x)*(x))
16 #define rep(i,a,b)  for(int i=(a);i<=(b);i++)
17 #define LL          long long
18 #define INF         0x3f3f3f3f
19 #define A           first
20 #define B           second
21 const int N=1e4+131;
22 int     n,k;
23 double  w[N],v[N],y[N];
24
25 bool check(double x)
26 {
27     for(int i=0;i<n;i++) {
28         y[i]=v[i]-x*w[i];
29     }
30     sort(y,y+n);
31
32     double sum=0;
33     for(int i=0;i<k;i++) {
34         sum+=y[n-i-1];
35     }
36
37     return sum>=0;
38 }
39
40 void solve()
41 {
42     scanf("%d%d",&n,&k);
43     for(int i=0;i<n;i++) {
44         scanf("%lf%lf",&w[i],&v[i]);
45     }
46
47     double lb=0,ub=INF;
48
49     for(int i=0;i<100;i++) {
50         double mid=(lb+ub)/2;
51         if(check(mid)) {
52             lb=mid;
53         } else {
54             ub=mid;
55         }
56     }
57     printf("%.2f\n",lb);
58 }
59 int main()
60 {
61     solve();
62
63     return 0;
64 }
时间: 2024-11-06 07:14:02

最大化平均值 (二分查找)的相关文章

poj 3111 K Best 最大化平均值 二分思想

poj 3111 K Best 最大化平均值 二分思想 题目链接: http://poj.org/problem?id=3111 思路: 挑战程序竞赛书上讲的很好,下面的解释也基本来源于此书 设定条件C(x):=可以选择使得单位重量的价值不小于x 如何判定C(x)是否可行 假设选了某个物品的集合是S,那么单位重量的价值是:\[ \sum\limits_{i \in S} {v_i } /\sum\limits_{i \in S} {w_i } \] 因此就变成了判断是否存在S满足下面的条件:\[

【二分查找-最大化平均值】POJ2976 - Dropping Test

[题目大意] 给出n组ai和bi,去掉k个使得a的总和除以b的总和最大. [思路] 也就是取(n-k)个数,最大化平均值,见<挑战程序设计竞赛>P144,最后公式为c(x)=((ai-x*bi)从大到小排列的前(n-k)个的和不小于0) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath>

Yougth的最大化(好题,二分查找 0 1分数规划)

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 1 #in

POJ 3111 K Best 二分 最大化平均值

1.题意:给一共N个物品,每个物品有重量W,价值V,要你选出K个出来,使得他们的平均单位重量的价值最高 2.分析:题意为最大化平均值问题,由于每个物品的重量不同所以无法直接按单位价值贪心,但是目标值有界且能判断与最后答案的大小关系,所以用二分来做 3.代码: 1 # include <iostream> 2 # include <cstdio> 3 # include <cmath> 4 # include <algorithm> 5 using names

二分算法的应用——最大化平均值

最大化平均值 有n个物品的重量和价值分别wi 和 vi.从中选出 k 个物品使得 单位重量 的价值最大. 限制条件: 1 <= k <= n <= 10^4 1 <= w_i <= v_i <= 10^6 输入:n = 3k = 2{W, V} = {(2,2), (5,3), (2,1)} 输出:0.75 (如果选0号和2号,平均价格是 (2 + 1) / (2 + 2) = 0.75) 题解: 一般先想到的肯定是:把物品按照  单位价值  进行排序,然后从大到小贪心

POJ 3111 K Best &amp;&amp;NYOJ 914 (二分+ 贪心,最大化平均值)

链接:NYOJ:click here, POJ:click here 题意:(最大化平均值,挑战编程P143) 有n个物品的重量和价值分别是w[i]和v[i],从中选出K个物品使得单位重量的价值最大.(1<=k<=n<=10^41<=w[i],v[i]<=10^6) 一般想到的是按单位价值对物品排序,然后贪心选取,但是这个方法是错误的,比如对nyoj的例题来说,从大到小地进行选取,输入的结果是5/7=0.714对于有样例不满足.我们一般用二分搜索来做(其实这就是一个01分数规

【leetcode边做边学】二分查找应用

更多请关注我的HEXO博客:http://jasonding1354.github.io/ 简书主页:http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles 二分查找 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法.搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束:如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较.如果在某一步骤数组 为

【二分查找学习】

知识准备 结合<算法导论>和<编程珠玑>,下面说明循环不变式的概念与性质. 循环不变式主要用来帮助理解算法的正确性.形式上很类似与数学归纳法,它是一个需要保证正确断言.对于循环不变式,必须证明它的三个性质: 初始化:它在循环的第一轮迭代开始之前,应该是正确的. 保持:如果在循环的某一次迭代开始之前它是正确的,那么,在下一次迭代开始之前,它也应该保持正确. 终止:循环能够终止,并且可以得到期望的结果. 适用范围 从有序数组中查找某个具体的值 假定一个解并判断是否可行 最大化最小值 最

算法复习笔记:二分查找

在计算机科学中,折半搜索(英语:half-interval search),也称二分查找算法(binary search).二分搜索法.二分搜索.二分探索,是一种在有序数组中查找某一特定元素的搜索算法.搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束:如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较.如果在某一步骤数组为空,则代表找不到.这种搜索算法每一次比较都使搜索范围缩小一半. 实现: int bin