poj2976 Dropping tests

Dropping tests
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 25137   Accepted: 8295

Descriptionios

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 beui

.spa

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.3d

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

Inputcode

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 ≤ aibi ≤ 1, 000, 000, 000. The end-of-file is marked by a test case with n = k = 0 and should not be processed.blog

Outputthree

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

Sample Inputci

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

#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 1010
#define eps 0.00000001
using namespace std;
int n,m,a[maxn],b[maxn];
double c[maxn];
int main(){
    freopen("Cola.txt","r",stdin);
    while(1){
        scanf("%d%d",&n,&m);
        if(n==0&&m==0)return 0;
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)scanf("%d",&b[i]);
        double l=0,r=1,mid;
        while(r-l>=eps){
            mid=(l+r)*1.0/2.0;
            for(int i=1;i<=n;i++)
                c[i]=1.0*a[i]-mid*b[i];
            sort(c+1,c+n+1);
            double sum=0;
            for(int i=m+1;i<=n;i++)sum+=c[i];
            if(sum>0)l=mid;
            else r=mid;
        }
        int ans=mid*100+0.5;
        printf("%d\n",ans);
    }
    return 0;
}
相關文章
相關標籤/搜索