d/ F

来源:互联网 发布:java年月日时分秒格式 编辑:程序博客网 时间:2024/06/01 10:19

加和二分

为啥这样算

n a certain course, you take n tests. If you get ai out ofbi 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 anyk 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 indicatingai for all i. The third line contains n positive integers indicatingbi for all i. It is guaranteed that 0 ≤ aibi ≤ 1, 000, 000, 000. The end-of-file is marked by a test case withn = k = 0 and should not be processed.

Output

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

Sample Input
3 15 0 25 1 64 21 2 7 95 6 7 90 0
Sample Output
83100
Hint

#include <iostream>#include<algorithm>#include<functional>using namespace std;const int maxn=1000+5;const int INF=1e8+10;int n,k;double a[maxn],b[maxn],c[maxn];bool judge(double mid){    for(int i=0;i<n;i++)        c[i]=a[i]-mid*b[i];//    sort(c,c+n,greater<double>());    double ans=0;    for(int i=0;i<k;i++) ans+=c[i];    return ans>=0;}int main(){    while(cin>>n>>k&&n)    {        k=n-k;        for(int i=0;i<n;i++)        {            cin>>a[i];            a[i]=a[i]*100;        }        for(int i=0;i<n;i++)            cin>>b[i];        double l=0,r=100.0;        while(r-l>0.000001)        {            double mid=(l+r)/2.0;            if(judge(mid)) l=mid;            else                r=mid;        }        int ans=(int )(l+0.5);        cout << ans<< endl;    }    return 0;}


0 0