POJ2976_Dropping tests_二分最大化平均值
2017-05-06 01:00
288 查看
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).
有一点不同的是本题是要求去掉 c 个,所以那个循环是 i < n - c 。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1010;
int n, c;
int a[maxn], b[maxn];
double dis[maxn];// a - mid * b
bool C(double x)
{
for(int i= 0; i< n; i++)
dis[i] = a[i] - x * b[i];
sort(dis, dis+n);
double sum = 0;
for(int i= c; i< n; i++)
sum += dis[i];
//如果最大的 n-c 项和为正, 说明 x 合法
return sum >= 0;
}
int main ()
{
while(1){
scanf("%d %d", &n, &c);
if(n == 0 && c == 0) break;
for(int i= 0; i< n; i++)
scanf("%d", a+i);
for(int i= 0; i< n; i++)
scanf("%d", b+i);
double lb = 0.0, ub = 1.0;
for(int k= 0; k< 100; k++){
double mid = (lb + ub) / 2;
if(C(mid)) lb = mid;
else ub = mid;
}
//这里的处理方式要学习
printf("%.0f\n", 100 * lb);
}
return 0;
}
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 12121 | Accepted: 4231 |
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).
有一点不同的是本题是要求去掉 c 个,所以那个循环是 i < n - c 。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1010;
int n, c;
int a[maxn], b[maxn];
double dis[maxn];// a - mid * b
bool C(double x)
{
for(int i= 0; i< n; i++)
dis[i] = a[i] - x * b[i];
sort(dis, dis+n);
double sum = 0;
for(int i= c; i< n; i++)
sum += dis[i];
//如果最大的 n-c 项和为正, 说明 x 合法
return sum >= 0;
}
int main ()
{
while(1){
scanf("%d %d", &n, &c);
if(n == 0 && c == 0) break;
for(int i= 0; i< n; i++)
scanf("%d", a+i);
for(int i= 0; i< n; i++)
scanf("%d", b+i);
double lb = 0.0, ub = 1.0;
for(int k= 0; k< 100; k++){
double mid = (lb + ub) / 2;
if(C(mid)) lb = mid;
else ub = mid;
}
//这里的处理方式要学习
printf("%.0f\n", 100 * lb);
}
return 0;
}
相关文章推荐
- POJ - 2976 Dropping tests(二分搜索:最大化平均值)
- poj2976 Dropping tests(二分法:最大化平均值)
- POJ - 3111 K Best && POJ - 2976 Dropping tests 最大化平均值(二分||牛顿迭代)
- POJ 2976 Dropping tests 【二分:最大化平均值】
- 《挑战程序设计竞赛》3.1.2 二分搜索-最大化平均值 POJ2976 3111
- POJ 2976 Dropping tests(二分查找 最大化平均值)
- POJ - 2976 Dropping tests(二分查找,最大化平均值)
- POJ2976二分搜索解决平均值最大化问题
- POJ2976-Dropping tests-最大化平均值
- 【二分查找-最大化平均值】POJ2976 - Dropping Test
- poj 2976 Dropping tests (二分搜索之最大化平均值之01分数规划)
- POJ 2976 Dropping tests【二分 最大化平均值】
- POJ 2976 Dropping tests 0/1分数规划问题 最大化平均值 贪心+二分
- POJ 3111 K Best + poj 2976 Dropping tests (二分, 最大化平均值)
- POJ - 2976 Dropping tests 二分 最大化平均值
- POJ2976————Dropping tests(二分法,最大化平均值)
- (最大化平均值)poj2976,Dropping tests
- 二分算法的应用——最大化平均值 POJ 2976 Dropping tests
- POJ 2976 3111(二分-最大化平均值)
- 最大化平均值---二分搜索