(最大化平均值)poj2976,Dropping tests

来源:互联网 发布:阿里云代码托管 收费 编辑:程序博客网 时间:2024/05/21 08:49

Dropping tests
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 6909 Accepted: 2388

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 15 0 25 1 64 21 2 7 95 6 7 90 0

Sample Output

83100

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

<pre name="code" class="cpp">#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1005;const double eps = 1e-5;typedef long long LL;int N, K;double a[maxn], b[maxn];double c[maxn];double ub, lb, ans;bool cmp(double a, double b){ return a > b; }bool judge(double x){for (int i = 1; i <= N; i++)c[i] = a[i] - b[i] * x / 100;sort(c + 1, c + 1 + N, cmp);double res = 0;for (int i = 1; i <= N - K; i++)res += c[i];return res >= 0;}void solve(){lb = 0; ub = 100;ans = 0;//注意,这里的初始化是必要的,理论上当mid=0时仍能得出正确结果;但是实质这里在ub>lb+eps的条件下,mid=(lb+ub)/2在mid取到0之前,while循环就结束了。while (ub > lb + eps){double mid = (lb + ub) / 2;if (judge(mid)){lb = mid;ans = mid;}elseub = mid;}printf("%.0lf\n", ans);}int main(){//freopen("f:\\input.txt", "r", stdin);while (scanf("%d%d", &N, &K)&&!(N==0&&K==0)){for (int i = 1; i <= N; i++) scanf("%lf", &a[i]);for (int i = 1; i <= N; i++) scanf("%lf", &b[i]);solve();}return 0;}




0 0
原创粉丝点击