poj2976 二分最大平均值

来源:互联网 发布:cs优化参数 编辑:程序博客网 时间:2024/05/10 23:24

 

 

如题:http://poj.org/problem?id=2976

Dropping tests
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 7697 Accepted: 2686

Description

In a certain course, you take n tests. If you get ai out ofbi questions correct on testi, 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 anyk 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 indicatingai for all i. The third line containsn positive integers indicating bi for alli. It is guaranteed that 0 ≤ aibi ≤ 1, 000, 000, 000. The end-of-file is marked by a test case withn = k = 0 and should not be processed.

Output

For each test case, write a single line with the highest cumulative average possible after droppingk 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

 

 

思路:对于平均数X,C(m,k,n):是否存在选取n-k个数的平均值>=m .如果存在,在右边搜索,否则在左边搜索。

如果满足C,则有sigma(xi-m*yi)>=0.因此按照xi-m*yi从大到小排序,如果和>=0,则存在。

注意输出,%.0f是按照输出0位小数但是第一位小数四舍五入,而%d不会四舍五入。

 

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN  1005
#define eps 1e-7
struct node
{
 int x,y;
}a[MAXN];
double b[MAXN];

int C(double x,int k,int n)
{
 int i;
 for(i=0;i<n;i++)
 {
  b[i]=a[i].x-x*a[i].y;
 }
 sort(b,b+n);
 double sum=0;
 for(i=0;i<n-k;i++)
 {
  sum+=b[n-1-i];
 }
 if(sum>=0)
  return 1;
 return 0;
}
int main()
{
// freopen("C:\\1.txt","r",stdin);
 int n,k;
 while(cin>>n>>k)
 {
  if(!n&&!k)
   break;
  int i;
  double l=0,r=1.0;
  for(i=0;i<n;i++)
  {
   cin>>a[i].x;
   r+=a[i].x;
  }
  for(i=0;i<n;i++)
   cin>>a[i].y;
  while(r-l>eps)
  {
   double mid=(l+r)/2;
   if(C(mid,k,n))
    l=mid;
   else
    r=mid;
  }
  printf("%.0f\n",l*100);
 }
 return 0;
}

 

0 0
原创粉丝点击