Dropping tests - POJ 2976 二分

来源:互联网 发布:seo职业发展方向 编辑:程序博客网 时间:2024/06/06 02:06

Dropping tests
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 5774 Accepted: 2001

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).


题意:问n对数中去掉k对后的比最大平均数是多少。

思路:这道题用贪心做找最大价值的做法是不对的。二分枚举这个平均数,然后看如果最大平均数是这个,那么sum的和是否大于0,(sum的意思具体见代码吧)。此外这道题在挑战程序设计竞赛中的145页也有代码。

AC代码如下:

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;int n,k;int w[1010];int v[1010];double y[1010];bool solve(double x){ int i;  double sum=0;  for(i=1;i<=n;i++)   y[i]=v[i]-w[i]*x;  sort(y+1,y+1+n);  for(i=1;i<=n-k;i++)   sum+=y[n-i+1];  if(sum>=0)   return true;  else   return false;}int main(){ int i,j;  while(~scanf("%d%d",&n,&k) && n>0)  { double l=0,r=1000000010,mi;    for(i=1;i<=n;i++)     scanf("%d",&v[i]);    for(i=1;i<=n;i++)     scanf("%d",&w[i]);    for(i=1;i<=300;i++)    { mi=(l+r)/2;      if(solve(mi))       l=mi;      else       r=mi;    }    printf("%.f\n",l*100);  }}




0 0
原创粉丝点击