您的位置:首页 > 其它

poj2976 二分最大平均值

2015-08-13 10:13 423 查看
如题:http://poj.org/problem?id=2976

Dropping tests

Time Limit: 1000MSMemory Limit: 65536K
Total Submissions: 7697Accepted: 2686
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
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: