POJ2976 Dropping tests —— 01分数规划 二分法

题目链接:http://poj.org/problem?id=2976

 

Dropping tests
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 13615   Accepted: 4780

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

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

 
 
 
题解:
 
 
 
 
代码如下:
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <queue>
 8 #include <stack>
 9 #include <map>
10 #include <string>
11 #include <set>
12 #define ms(a,b) memset((a),(b),sizeof((a)))
13 using namespace std;
14 typedef long long LL;
15 const double EPS = 1e-8;
16 const int INF = 2e9;
17 const LL LNF = 2e18;
18 const int MAXN = 1e3+10;
19 
20 int a[MAXN], b[MAXN];
21 double d[MAXN];
22 int n, k;
23 
24 bool test(double L)
25 {
26     for(int i = 1; i<=n; i++)
27         d[i] = 1.0*a[i] - L*b[i];
28     sort(d+1, d+1+n);
29     double sum = 0;
30     for(int i = k+1; i<=n; i++) //舍弃前k小的数
31         sum += d[i];
32     return sum>=0;
33 }
34 
35 int main()
36 {
37     while(scanf("%d%d", &n, &k) && (n||k))
38     {
39         for(int i = 1; i<=n; i++)
40             scanf("%d", &a[i]);
41         for(int i = 1; i<=n; i++)
42             scanf("%d", &b[i]);
43 
44         double l = 0, r = 1.0;
45         while(l+EPS<=r)
46         {
47             double mid = (l+r)/2;
48             if(test(mid))
49                 l = mid + EPS;
50             else
51                 r = mid - EPS;
52         }
53         printf("%.0f\n", r*100);
54     }
55 }
View Code

 

 

posted on 2017-09-20 19:27  h_z_cong  阅读(299)  评论(0编辑  收藏  举报

导航