poj2976 二分最大平均值
来源:互联网 发布:cs优化参数 编辑:程序博客网 时间:2024/05/10 23:24
如题:http://poj.org/problem?id=2976
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 ≤ ai ≤bi ≤ 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
思路:对于平均数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;
}
- poj2976 二分最大平均值
- POJ2976二分搜索解决平均值最大化问题
- POJ2976 Dropping tests 最大化平均值(二分)
- POJ2976 Dropping tests (最大化平均值/二分)
- POJ2976 最大化平均值
- 《挑战程序设计竞赛》3.1.2 二分搜索-最大化平均值 POJ2976 3111
- 最大化平均值——POJ2976
- POJ2976-Dropping tests-最大化平均值
- Pie poj 二分求最大平均值
- [二分]poj2976 Dropping tests
- poj2976 Dropping tests 二分
- (最大化平均值)poj2976,Dropping tests
- poj2976 Dropping tests(二分法:最大化平均值)
- POJ2976 Dropping tests 二分搜索
- POJ2976(01分数规划+二分)
- poj2976
- poj2976
- poj2976
- 路由配置相关知识
- redirect 与 forward 的区别
- 浅谈Unity3D中的Coroutine及其使用(延时、定时调用函数)
- 小白学开发(iOS)OC_ SEL数据类型(2015-08-10)
- linux RedHat配置好用的yum资源
- poj2976 二分最大平均值
- ubuntu的init与系统服务设置
- C++ 的社会繁衍
- JAVA里生成随机文件名
- 多线程基础
- POJ 3468 A Simple Problem with Integers
- PHP实现页面后退保存表单内容的两种方法
- mybatis自动生成实体类和配制文件
- [IOS 开发] 防止button被点击多次