poj2976 二分最大平均值
2015-08-13 10:13
423 查看
如题:http://poj.org/problem?id=2976
Dropping tests
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
Sample Output
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;
}
Dropping tests
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7697 | Accepted: 2686 |
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;
}
相关文章推荐
- 解决was启动缓慢 超时问题
- 【leetcode每日一题】NO206.Reverse Linked List
- Android性能优化典范(二)
- gravity、layout_gravity及orientation
- UNIX网络编程卷一:第十六章 非阻塞I/O
- 类找不到问题追踪及分析
- sql的count()函数,php怎么取他的值
- Struts2动态方法调用
- RadioButton不能切换问题
- 从配置文件里读取配置信息
- 《招聘一个靠谱的iOS》面试题参考答案(上)
- 《android---获取值AndroidManifest.xml中meta-data的value》
- scp命令的实际应用
- 统计数n阶乘中0的位数
- SpringMVC基于代码的配置方式(零配置,无web.xml)
- 随机生成id,不会重复
- Android studio中正确引入so文件的方法
- overridePendingTransition的简介
- 扩展的验证工具类
- javascript高级程序设计知识整理(2)