[二分-最大化平均值]poj-2976

原创 2018年04月16日 21:24:43
Dropping tests
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 15588 Accepted: 5440

Description

In a certain course, you take n tests. If you get ai out of bi questions correct on test i, your cumulative average is defined to be

.

Given your test scores and a positive integer k, determine how high you can make your cumulative average if you are allowed to drop any k of your test scores.

Suppose you take 3 tests with scores of 5/5, 0/1, and 2/6. Without dropping any tests, your cumulative average is . However, if you drop the third test, your cumulative average becomes .

Input

The input test file will contain multiple test cases, each containing exactly three lines. The first line contains two integers, 1 ≤ n ≤ 1000 and 0 ≤ k < n. The second line contains n integers indicating ai for all i. The third line contains n positive integers indicating bi for all i. It is guaranteed that 0 ≤ ai ≤ bi ≤ 1, 000, 000, 000. The end-of-file is marked by a test case with n = k = 0 and should not be processed.

Output

For each test case, write a single line with the highest cumulative average possible after dropping k of the given test scores. The average should be rounded to the nearest integer.

Sample Input

3 1
5 0 2
5 1 6
4 2
1 2 7 9
5 6 7 9
0 0

Sample Output

83
100

Hint

To avoid ambiguities due to rounding errors, the judge tests have been constructed so that all answers are at least 0.001 away from a decision boundary (i.e., you can assume that the average is never 83.4997).


题意:

给出n个二元组(a,b),删除k个二元组,使得剩下的a元素之和与b元素之和的比率最大(比率最后*100)

题解:

最大化平均值 : 01分数规划

最裸的01分数规划
    设x[i]属于{0,1},表示第i个元组是否留下,p为比率,P为p的最大值,即比例的最大值(注意区分P和p)
    则 p = sigma(ai*xi) / sigma(bi*ai),其中sigma(xi) = n-k; -> 表示有n-k个1
    显然;对于所有可能取得的p的值,p <= P;
    即对于所有可能的xi的组合,sigma(ai*xi) / sigma(bi*xi) <= P
    即sigma(ai*xi) / sigma(bi*xi)的最大值就是等于P的
    于是对于p sigma(ai*xi) - sigma(bi*xi*p) > 0;当 p < P;
    当p = P时 ,sigma(ai*xi) - sigma(bi*xi*p) == 0;
    当p > P,时 sigma(ai*xi) - sigma(bi*xi*p) < 0


    我们要二分寻找p,使得p无限接近P. 于是 当 max(sigma(ai*xi) - sigma(bi*xi*p)) >= 0 时 说明此时满足情况,需要最大化向右搜
    否则向左搜

代码:

/**
    最大化平均值 : 01分数规划
    给出n个二元组(a,b),删除k个二元组,使得剩下的a元素之和与b元素之和的比率最大(比率最后*100)
    题解:最裸的01分数规划
    设x[i]属于{0,1},表示第i个元组是否留下,p为比率,P为p的最大值,即比例的最大值(注意区分P和p)
    则 p = sigma(ai*xi) / sigma(bi*ai),其中sigma(xi) = n-k; -> 表示有n-k个1
    显然;对于所有可能取得的p的值,p <= P;
    即对于所有可能的xi的组合,sigma(ai*xi) / sigma(bi*xi) <= P
    即sigma(ai*xi) / sigma(bi*xi)的最大值就是等于P的
    于是对于p sigma(ai*xi) - sigma(bi*xi*p) > 0;当 p < P;
    当p = P时 ,sigma(ai*xi) - sigma(bi*xi*p) == 0;
    当p > P,时 sigma(ai*xi) - sigma(bi*xi*p) < 0

    我们要二分寻找p,使得p无限接近P. 于是 当 max(sigma(ai*xi) - sigma(bi*xi*p)) >= 0 时 说明此时满足情况,需要最大化向右搜
    否则向左搜

*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e3+10;
const int inf = 1e9+10;
const double eps = 1e-6;
int arr[maxn],tot[maxn];
double ans[maxn];
int n,k;
bool check(double mid)
{
    for(int i=0;i<n;i++) {
        ans[i] = ((double)arr[i] - mid * tot[i]);
    }
    sort(ans,ans+n);
    double sum = 0;
    for(int i=k;i<n;i++) {
        sum += ans[i];
    }
    return sum >= 0;
}
int main()
{
    while(~scanf("%d%d",&n,&k),n+k)
    {
        for(int i=0;i<n;i++) scanf("%d",&arr[i]);
        for(int i=0;i<n;i++) scanf("%d",&tot[i]);
        double left = 0,right = inf;
        while(left + eps < right) {
            double mid = (left + right) / 2;
            if(check(mid)) left = mid;
            else right = mid;
        }
        right = right * 100;
        printf("%.0f\n",right);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38013346/article/details/79966823

Struts快速入门(二)

Struts MVC 语义 我们从关键的Struts抽象概念开始,这是它MVC架构的核心。Struts使用Service to Worker模式实现了MVC模式。[Core] 控制器对象控制器被Act...
  • icecloud
  • icecloud
  • 2003-05-13 11:03:00
  • 1685

最大化平均值(二分搜索)

有n个物品的重量和价值分别是w[i]和v[i]。从中选出k个物品使得单位重量的价值最大。 限制条件: 1 1 输入    n=3    k=2    (w,v)={(2,2),(5,3),(2,1)}...
  • m0_37846371
  • m0_37846371
  • 2017-06-16 12:47:38
  • 222

《挑战程序设计竞赛》3.1.1 二分搜索-最大化最小值 POJ1064 2456 3258 3273 3104 3045

POJ1064http://poj.org/problem?id=1064题意给出n条线段,以米的单位给出,小数点后两位(精确到厘米),要你对这些线段裁剪,裁剪出m条等长的线段,并且让这些线段尽可能长...
  • thudaliangrx
  • thudaliangrx
  • 2015-12-31 20:47:45
  • 785

POJ - 2976 Dropping tests(二分查找,最大化平均值)

题意:有N个考试,每个考试有ai和bi两个值,最后成绩由上面的公式求得。幸运的是,可以放弃K个科目,求最大化最后的成绩。 思路:由题意可知当,当n-k个科目组成最优解时,再增加别的科目,解一定不如原来...
  • qq_18738333
  • qq_18738333
  • 2015-09-29 00:48:30
  • 381

二分法求最大化平均值

有n个物品,每个物品分别对应一个重量和价值。要求选出k个,使得平均每单位重量的价值最大。思路:设k的集合是S ,使得平均值最大,即 Vs/Ws 最大。枚举答案x,Vs/Ws>=x,即 Vs – Ws*...
  • u014427196
  • u014427196
  • 2015-06-05 18:14:16
  • 350

最大化平均值——poj 3111

题目描述:
  • u012158352
  • u012158352
  • 2014-11-25 09:16:37
  • 403

[二分] 最大化平均值

有n个物品的重量和价值分别是wi和vi,从中选出k个物品,使得单位重量的价值最大。 1≤k≤n≤10^4 1≤wi,vi≤10^6样例输入: n = 3 k = 2 w1=2 v1=2 ...
  • u012848631
  • u012848631
  • 2015-08-08 11:52:00
  • 253

《挑战程序设计竞赛》3.1.2 二分搜索-最大化平均值 POJ2976 3111

POJ2976http://poj.org/problem?id=2976题意给出n个对,可以从中最多排除k个对,求∑a/∑b的最大值。思路二分法求解,书中例题跟这个题其实是一样的。 这个题对精度的...
  • thudaliangrx
  • thudaliangrx
  • 2015-12-31 22:36:14
  • 354

最大化平均值 【二分法】

n个物品重量价值分别为wi,vi;取k个值使得单位重量的价值最大。 输入: n k 接下来n行表示重量 接下来n行表示价值分析: 贪心是错的。 使的vi/wi最大 ,假设单位重量的最大价值...
  • u014427196
  • u014427196
  • 2015-03-27 18:09:25
  • 602

二分法典型应用(三)最大化平均值

和最大化最小值类似,最大化平均值也可以通过二分法求得。比如下面这个经典的问题: 有n个物品的重量和价值分别是wi和vi,从中选出k个物品使得单位重量价值最大。样例输入:3 2 2 2 5 3 2 1...
  • karry_zzj
  • karry_zzj
  • 2017-04-18 20:08:39
  • 236
收藏助手
不良信息举报
您举报文章:[二分-最大化平均值]poj-2976
举报原因:
原因补充:

(最多只允许输入30个字)