01分数规划 POJ2976 Dropping tests

时间:2022-12-01 18:39:56
Dropping tests
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 12451   Accepted: 4363

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

01分数规划 POJ2976 Dropping tests.

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 01分数规划 POJ2976 Dropping tests. However, if you drop the third test, your cumulative average becomes 01分数规划 POJ2976 Dropping tests.

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 ≤ aibi ≤ 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

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

Stanford Local 2005   01分数规划的模板题,讲解的话加一个写得整齐的链接吧。  
 1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 using namespace std;
6 const double acc=1e-7;//accuracy-精度
7 int n,k;
8 double l,r,mid,sum;
9 double a[1010],b[1010],d[1010];//定义为double
10 int main(){
11 while(scanf("%d%d",&n,&k)){
12 if(!n&&!k) return 0;
13 for(int i=1;i<=n;i++) scanf("%lf",&a[i]);
14 for(int i=1;i<=n;i++) scanf("%lf",&b[i]);
15 l=0.0;
16 r=1.0;
17 while(r-l>acc){
18 mid=(l+r)*1.0/2;
19 for(int i=1;i<=n;i++) d[i]=a[i]-mid*b[i];
20 sort(d+1,d+n+1);
21 sum=0.0;
22 for(int i=k+1;i<=n;i++) sum+=d[i];
23 if(sum>0) l=mid;
24 else r=mid;
25 }
26 printf("%.0f\n",mid*100);
27 }
28 }