题目:
http://poj.org/problem?id=2976
题意:
n组数a,b, a组做分子,b组做分母,除去其中的任意k组,求出最大的数.
思路:
二分,求最大化平均值. 与挑战程序设计144页例题类似.
需要注意的是输出:
double a = 4.3, b = 4.7;
printf("%d %d\n", (int)a, (int)b); 4 4
printf("%.0f %.0f\n", a, b) ; 4 5 (四舍五入)
CODE:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const double esp = 1e-7;
struct node { double z, m; }num[1005];
double y[1005];
int n, k;
bool cmp(double a, double b)
{
return a > b;
}
bool can(double x)
{
for(int i = 0; i < n; ++i) {
y[i] = num[i].z - x * num[i].m;
}
sort(y, y + n, cmp);
double sum = 0;
for(int i = 0; i < k; ++i) {
sum += y[i];
}
return sum >= 0;
}
void solve()
{
double l = 0, r = 1;
while(r - l > esp) {
double mid = (r + l) / 2;
if(can(mid)) l = mid;
else r = mid;
}
printf("%.0f\n", l*100);
}
int main()
{
//freopen("in", "r", stdin);
while(~scanf("%d %d", &n, &k)) {
if(n == 0 && k == 0) break;
for(int i = 0; i < n; ++i) {
scanf("%lf", &num[i].z);
}
for(int i = 0; i < n; ++i) {
scanf("%lf", &num[i].m);
}
k = n - k;
solve();
}
return 0;
}