zoukankan      html  css  js  c++  java
  • POJ:2976 Dropping tests(二分+最大化平均值)

    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 aifor 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个考试,每个考试有ai和bi两个值,最后成绩由上面的公式求得。幸运的是,可以放弃K个科目,求最大化最后的成绩。

    思路:这是一道简单的最大化平均值模板题,化简出(ai-mid*bi)>0,求n-k前项。

    AC代码:

    #include<stdio.h>
    #define INF 0x3f3f3f3f
    #include<algorithm>
    using namespace std;
    bool cmp(double x,double y)
    {
        return x>y;
    }
    int n,k;
    double y[1100];
    int a[1100];
    int b[1100];
    bool C(double  mid)
    {
       for(int i=0 ; i<n ; i++)
       {
           y[i]=a[i]-mid*b[i];
       }
       sort(y,y+n,cmp);
       double  sum=0;
       for(int i=0 ; i<n-k ; i++)
       {
           sum+=y[i];
       }
       if(sum>=0)
        return true;
       return false;
    }
    int main()
    {
        while(scanf("%d%d",&n,&k)!=EOF)
        {
            if(n==0&&k==0)
                break;
            for(int i=0 ; i<n ; i++)
                scanf("%d",&a[i]);
            for(int i=0 ; i<n ; i++)
                scanf("%d",&b[i]);
            double   st=0,en=INF;
            for(int i=1 ; i<=100 ; i++)
            {
                double mid=(st+en)/2;
                if(C(mid))
                    st=mid;
                else
                    en=mid;
            }
    
            printf("%.0f
    ",st*100);
        }
    }
    View Code
  • 相关阅读:
    web测试方法总结
    我认为测试应该掌握的SQL语句
    monkey(1)
    冒烟测试
    PC客户端测试总结
    常见测试点总结
    测试基本概念
    测试主要环节
    手机app常见bug积累
    MySQL面试题集锦
  • 原文地址:https://www.cnblogs.com/shuaihui520/p/8932839.html
Copyright © 2011-2022 走看看