Dropping tests(01分数规划)
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8176 | Accepted: 2862 |
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
题解:给你n个数,让求删除k个数后
的最大值;01分数规划;
代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 const int MAXN=10010; 8 struct Node{ 9 int a,b; 10 }; 11 Node dt[MAXN]; 12 double d[MAXN]; 13 int n,k; 14 bool fsgh(double R){ 15 double sum=0; 16 for(int i=0;i<n;i++)d[i]=dt[i].a-R*dt[i].b; 17 sort(d,d+n); 18 for(int i=n-1;i>=n-k;i--)sum+=d[i]; 19 return sum>0?true:false; 20 } 21 double erfen(double l,double r){ 22 double mid; 23 while(r-l>1e-6){ 24 mid=(l+r)/2; 25 if(fsgh(mid))l=mid; 26 else r=mid; 27 } 28 return mid; 29 } 30 int main(){ 31 while(scanf("%d%d",&n,&k),n|k){ 32 double mx=0; 33 k=n-k; 34 for(int i=0;i<n;i++)scanf("%d",&dt[i].a); 35 for(int i=0;i<n;i++)scanf("%d",&dt[i].b),mx=max(1.0*dt[i].a/dt[i].b,mx); 36 printf("%.0f\n",erfen(0,mx)*100); 37 } 38 return 0; 39 }