zoukankan      html  css  js  c++  java
  • POJ 2976 Dropping tests (0/1分数规划)

    Dropping tests
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 4654   Accepted: 1587

    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).

    Source

     
     

    给定ai和bi,求100*sigma(ai*xi)/sigma(bi*xi)的最大值,xi=0或1,且只能有k个为0。

    即可以去掉k个(ai,bi)对。

    y=100*sigma(ai)/sigma(bi)

    t(y)=100*sigma(ai)-y*sigma(bi)

    求t(y0)=0;

    当t(y)<0时,y太大,y0<y;

    当t(y)>0时,y太小,y<y0;

    所以可以二分y的值。

    去哪k个更优了?

    要使y更大就应该是t(y)>0这种情况更可能的出现,所以对100*ai-bi排序,去掉小的k个。使t(y)>0城里更有可能。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    
    using namespace std;
    
    const int N=1010;
    const double eps=1e-10;
    
    int n,k;
    double a[N],b[N],score[N];
    
    int main(){
    
        //freopen("input.txt","r",stdin);
    
        while(~scanf("%d%d",&n,&k)){
            if(n==0 && k==0)
                break;
            for(int i=0;i<n;i++)
                scanf("%lf",&a[i]);
            for(int i=0;i<n;i++)
                scanf("%lf",&b[i]);
            double l=0,r=100,mid,sum;
            while(r-l>eps){
                mid=(l+r)/2;
                for(int i=0;i<n;i++)
                    score[i]=100*a[i]-mid*b[i];
                sort(score,score+n);
                sum=0;
                for(int i=k;i<n;i++)
                    sum+=score[i];
                if(sum>0)
                    l=mid;
                else
                    r=mid;
            }
            printf("%.0f
    ",l);
        }
        return 0;
    }
  • 相关阅读:
    Error from server at http://127.0.0.1:8983/solr/xxx: undefined field type
    js判断json对象是否为空
    js删除json指定元素
    crossdomain.xml跨域配置文件的安全注意事项
    WEB安全番外第一篇--其他所谓的“非主流”漏洞:URL跳转漏洞与参数污染
    Linux应急响应思路详谈
    glassfish任意文件读取漏洞解析
    SRC常见WEB漏洞系列之HTTP-HOST头攻击
    WEB安全第七篇--终结篇考验逻辑思维:逻辑漏洞大汇总(越权、会话逻辑、业务逻辑、暴力破解)
    WEB安全第六篇--千里之外奇袭客户端:XSS和HTML注入
  • 原文地址:https://www.cnblogs.com/jackge/p/3177263.html
Copyright © 2011-2022 走看看