【二分查找-最大化平均值】POJ2976 - Dropping Test
【题目大意】
给出n组ai和bi,去掉k个使得a的总和除以b的总和最大。
【思路】
也就是取(n-k)个数,最大化平均值,见《挑战程序设计竞赛》P144,最后公式为c(x)=((ai-x*bi)从大到小排列的前(n-k)个的和不小于0)。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <cmath>
#define maxn 2005
#define maxz 2005
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
int n,k;
int v[maxn],w[maxn];
double y[maxn];
bool judge(double x)
{
for(int i=0;i<n;i++)
{
y[i]=v[i]-w[i]*x;
}
sort(y,y+n);
double sum=0;
for(int i=0;i<n-k;i++)
{
sum+=y[n-1-i];
}
return sum>=0;
}
void solve()
{
double L,H;
L=0;H=INF;
for(int i=0;i<100;i++)
{
double mid=(L+H)/2;
if(judge(mid))
L=mid;
else
H=mid;
}
printf("%.0f\n",H*100);
}
int main()
{
//ios::sync_with_stdio(false);
while(cin>>n>>k)
{
if(!n&&!k)
break;
for(int i=0;i<n;i++)
{
cin>>v[i];
}
for(int i=0;i<n;i++)
{
cin>>w[i];
}
solve();
}
return 0;
}