您的位置:首页 > 编程语言 > Go语言

POJ2976二分搜索解决平均值最大化问题

2014-12-30 12:25 190 查看
//一道最大化平均值的问题

//输出是100*平均值的最大值并且取其中最接近的整数
//由于贪心算法不行只能二分查找法了

//同时由于是lb和ub过于小所以循环100次就行了接近精度10-30次方

//164K 282MS

#include <iostream>
#include <algorithm>
using namespace std;

#define MAX_N 1005

static int a[MAX_N];
static int b[MAX_N];
static double y[MAX_N];
static int N,K;

static bool C(double x){
for (int i=0;i<N;++i)
y[i] = a[i] - x*b[i];
sort(y,y+N);
double sum = 0;
for (int i=0;i<(N-K);++i)
sum += y[N-i-1];
return sum>=0;
}

int main(){
while(scanf("%d %d",&N,&K)==2){
if (!N&&!K)
break;
double lb = 0;
double ub = 1;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for (int i=0;i<N;++i)
scanf("%d",&a[i]);
for (int i=0;i<N;++i)
scanf("%d",&b[i]);
for (int i=0;i<100;++i)//2的100次方
{
double mid = (lb+ub)/2;
if (C(mid))
lb = mid;
else
ub = mid;
}
int ret = ub*100 + 0.5;
printf("%d\n",ret);

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息