ACM Dropping tests

在某个课程中,你进行n次测试。如果你从bi问题中得到ai,那么你的累积平均值就是

.


给定您的考试成绩和正整数k,如果你被允许放弃你的考试成绩的任意k,您可以获得多大的累积平均成绩。

假设您以5/5,0/1和2/6的分数进行3次测试。 不放弃任何测试,您的累计平均是 . 但是,如果你放弃第三个测试,你的累积平均值就会变成.

Input

输入测试文件将包含多个测试用例,每个测试用例只包含三行。第一行包含两个整数,1≤n≤1000,0≤k<n。  第二行包含n个整数,表示所有i的ai。 第三行包含n个正整数,表示所有i的bi。保证0≤ai≤bi≤1,000,000,000.文件结尾标记为n = k = 0的测试用例,不应该被处理。

Output

对于每个测试用例,在丢弃k个给定测试分数之后,写入具有最高累积平均值的单行。平均值应该四舍五入到最近的整数。

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

 

 

 1 #include<stdio.h>
 2 #include<iostream>/*poj上不认#include<bits/stdc++.h> */
 3 #include<algorithm>
 4 using namespace std;
 5 int n,k;
 6 double a[1005],b[1005],d[1005];
 7 double judge(double num)
 8 {
 9     for(int i = 0; i < n; i++)
10     {
11         d[i] = a[i] - num*b[i];
12     }
13     sort(d,d+n);
14     double sum = 0;
15     for(int i = k; i < n; i++)
16         sum += d[i];
17     return sum;    
18 }
19 int main()
20 {
21 
22     while(cin>>n>>k,n||k)
23     {
24         for(int i = 0; i < n; i++)
25             scanf("%lf",&a[i]);
26         for(int i = 0; i < n; i++)
27             scanf("%lf",&b[i]);
28         double right = 1 ,left = 0,mid;
29         while(right - left > 1e-8)
30         {
31             mid = (right + left) /2;
32             if(judge(mid) > 0)
33                 left = mid;
34             else
35               right = mid;
36             
37         }
38         printf("%.0f\n",mid*100);/*poj上注意数据格式输出*/
39         
40         
41     }
42     return 0;
43  } 

 

 参考博客:http://blog.csdn.net/lin375691011/article/details/38487411

posted @ 2017-08-24 10:39  听说这是最长的名字了  阅读(140)  评论(0)    收藏  举报