【最大化平均值】POJ3111-K Best

【题目大意】

给出v[]和w[],求的最大值。

【思路】

二分s(S)的值,可变形为s(S)*Σw>=Σv,所以只需要把求出x*w[i]-v[i],看看前k个的和是否大于等于0,大于等于0就满足条件。

由于进度非常高,注意二分的写法。

*原本在check(mid)=1之后会存下ansqueue,然后再输出,就wa了。 然而改成直接输出最后一次check的序列(不管返回是0还是1)。不明白为什么。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int MAXN=100000+50;
 7 const double eps=1.0e-6;
 8 int n,k,v[MAXN],w[MAXN];
 9 int ansqueue[MAXN];
10 struct node
11 {
12     double rem;
13     int id;
14     bool operator < (const node &x) const
15     {
16         return (rem>x.rem);
17     }
18 };
19 node queue[MAXN];
20
21 int check(double x)
22 {
23     for (int i=1;i<=n;i++)
24     {
25         queue[i].rem=v[i]-x*w[i];
26         queue[i].id=i;
27     }
28     sort(queue+1,queue+n+1);
29     double sum=0;
30     for (int i=1;i<=k;i++) sum+=queue[i].rem;
31     if (sum>=0.0) return 1;
32         else return 0;
33 }
34
35 void solve()
36 {
37     for (int i=1;i<=n;i++) scanf("%d%d",&v[i],&w[i]);
38     double lb=0.0,ub=0x3f3f3f3f;
39     while (ub-lb>eps)
40     {
41         double mid=(lb+ub)/2;
42         if (check(mid)) lb=mid;
43             else ub=mid;
44     }
45     for (int i=1;i<=k;i++)
46     {
47         printf("%d",queue[i].id);
48         if (i!=k) cout<<‘ ‘;
49     }
50     /*我原本在check(mid)=1之后会存下ansqueue,然后再输出,就wa了。
51      然而改成直接输出最后一次check的序列(不管返回是0还是1)。不明白为什么。*/
52     cout<<endl;
53 }
54
55 int main()
56 {
57     while (scanf("%d%d",&n,&k)!=EOF) solve();
58     return 0;
59 }
时间: 2024-10-28 10:37:22

【最大化平均值】POJ3111-K Best的相关文章

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分数规

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

POJ 3111 K Best(最大化平均值)

题目链接:click here~~ [题目大意]有n个物品的重量和价值分别是Wi和Vi,从中选出K个物品使得单位重量的价值最大,输出物品的编号 [解题思路]:最大化平均值的经典.参见click here~~ 代码: //#include <bits/stdc++.h> #include <stdio.h> #include <math.h> #include <string.h> #include <iostream> #include <

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满足下面的条件:\[

POJ-2976 Dropping tests---二分最大化平均值

题目链接: https://cn.vjudge.net/problem/POJ-2976 题目大意: 给定n个二元组(a,b),扔掉k个二元组,使得剩下的a元素之和与b元素之和的比率最大 解题思路: 扔掉k个球最大化平均值就是求取n-k个的最大化平均值 和POJ-3111类似 直接用最大化平均值模板 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath>

【二分查找-最大化平均值】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>

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

最大化平均值 有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) 题解: 一般先想到的肯定是:把物品按照  单位价值  进行排序,然后从大到小贪心

二分法 最大化平均值

摘自 挑战程序设计竞赛 和最大化最小值类似,最大化平均值也可以通过二分法求得. 比如下面这个经典的问题: 有n个物品的重量和价值分别是wi和vi,从中选出k个物品使得单位重量价值最大. 样例输入: 3 22 25 32 11234样例输出: 0.751分析: 一般先想到的是将每个物品的单位重量价值算出来,然后排个序,从大到小贪心进行选择,可惜这样是不对的,这样不能保证最后一定是最大平均值,直接用贪心对于这类要涉及多个因素比如求最大平均值的问题就显得不那么正确了. 那么我们这样分析这个问题: 令C

POJ3111 K Best(另类背包+二分+变态精度)

POJ3111 K Best,看讨论区说数据有点变态,精度要求较高,我就直接把循环写成了100次,6100ms过,(试了一下30,40都会wa,50是4000ms) 第一次在POJ上看到下面这种东西还是很好奇的, 一个题目可以接受多种正确答案,即有多组解的时候,题目就必须被Special Judge.Special Judge程序使用输入数据和一些其他信息来判答你程序的输出,并将判答结果返回. Case Time Limit: 2000MS   Special Judge #include <c

poj 3111 K Best (二分搜索之最大化平均值之01分数规划)

Description Demy has n jewels. Each of her jewels has some value vi and weight wi. Since her husband John got broke after recent financial crises, Demy has decided to sell some jewels. She has decided that she would keep k best jewels for herself. Sh