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

浙公网安备 33010602011771号