POJ 2976 Dropping tests(二分搜索,最大化平均值)
2015-12-04 19:00
381 查看
[align=center]Dropping tests[/align]
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).
题意:在一场测试中有N项,每一项都有bi个题目,答对ai个。总的答对率就是(a1+a2+....+an-1)/(b1+b2+....+bn-1),现在可以让你从这N项测验中抽出K门不计入总的答题中,问最高答对率会是多少?
题解:二分搜索答对率,每得到一个值x,将其乘以bi,将yi=ai-bi*x,再将yi从大到小排序,看前n-k个yi的和是否大于等于0,是则表明当前x是最大答对率或小于最大答对率,否则表示当前x大于最大答对率。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 1000000010
using namespace std;
double a[1010],b[1010];
double y[1010];
int n,k;
int cmp(double a,double b)
{
return a>b;
}
bool dis(double x)
{
int i;
for(i=0;i<n;++i)
y[i]=a[i]-x*b[i];
sort(y,y+n,cmp);
double sum=0;
for(i=0;i<(n-k);++i)//注意是抽出k门课成绩不统计
sum+=y[i];
return sum>=0;
}
int main()
{
int i;
while(scanf("%d%d",&n,&k)&&n!=0||k!=0)
{
for(i=0;i<n;++i)
scanf("%lf",&a[i]);
for(i=0;i<n;++i)
scanf("%lf",&b[i]);
i=100;
double left=0,right=INF,mid;
while(i--)
{
mid=(left+right)/2;
if(dis(mid))
left=mid;
else
right=mid;
}
mid*=100;
printf("%.0f\n",mid);
}
return 0;
}
[align=center]Dropping tests[/align]
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8233 | Accepted: 2883 |
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).
题意:在一场测试中有N项,每一项都有bi个题目,答对ai个。总的答对率就是(a1+a2+....+an-1)/(b1+b2+....+bn-1),现在可以让你从这N项测验中抽出K门不计入总的答题中,问最高答对率会是多少?
题解:二分搜索答对率,每得到一个值x,将其乘以bi,将yi=ai-bi*x,再将yi从大到小排序,看前n-k个yi的和是否大于等于0,是则表明当前x是最大答对率或小于最大答对率,否则表示当前x大于最大答对率。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 1000000010
using namespace std;
double a[1010],b[1010];
double y[1010];
int n,k;
int cmp(double a,double b)
{
return a>b;
}
bool dis(double x)
{
int i;
for(i=0;i<n;++i)
y[i]=a[i]-x*b[i];
sort(y,y+n,cmp);
double sum=0;
for(i=0;i<(n-k);++i)//注意是抽出k门课成绩不统计
sum+=y[i];
return sum>=0;
}
int main()
{
int i;
while(scanf("%d%d",&n,&k)&&n!=0||k!=0)
{
for(i=0;i<n;++i)
scanf("%lf",&a[i]);
for(i=0;i<n;++i)
scanf("%lf",&b[i]);
i=100;
double left=0,right=INF,mid;
while(i--)
{
mid=(left+right)/2;
if(dis(mid))
left=mid;
else
right=mid;
}
mid*=100;
printf("%.0f\n",mid);
}
return 0;
}
相关文章推荐
- centos最新版solr5.3.1安装和数据整理以及遇到的问题解答
- Linux学习篇之---scp命令
- linux crontab 实现每秒执行(转)
- Linux命令答疑
- LINUX中的中断处理
- Linux下安装并使用Java开发opencv的配置
- linux 磁盘性能测试工具fio
- Opencv SkinOtsu皮肤检测
- OpenCv椭圆皮肤模型
- OpenCv皮肤检测-HSV分离
- android-studio开发NDK错误记录:bash: ../../build/intermediates/classes/debug: is a directory
- 架构之路(八)从CurrentUser说起
- linux下输出tomcat控制台信息
- linux 下各errno的意义
- Maps for Developers
- PowerShell检测并添加用户权限
- Linux的文件权限和目录配置
- tomcat指定jdk
- iPhone->类似于popoverView的一个菜单组件
- linux shell自带变量