题目链接:
http://poj.org/problem?id=2976
题意:
给出n列数,去掉k列使得第一排的数的和除第二排的数的和最大,结果乘上100输出,保留零位小数;
解:
设答案为S,
Σa[i] / Σb[i] >=S,移项后可以得到,Σa[i]-Σb[i]*S>=0,整理后得Σ(a[i]-b[i]*S)>=0,那么就可以根据二分找到答案了
(PS:貌似我将二分的结果存入函数里运行结果会出问题,有没有知道的大佬留言告诉我一声怎么回事,谢谢!)
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=1005;
const double eps=1e-7;
double a[maxn],b[maxn],c[maxn];
int n,k;
int main()
{
while(~scanf("%d%d",&n,&k))
{
if(n==0&&k==0)break;
for(int i=1;i<=n;i++)
scanf("%lf",&a[i]);
for(int i=1;i<=n;i++)
scanf("%lf",&b[i]);
double l=0,r=1,mid;
double ans;
while(r-l>eps)
{
mid=(l+r)/2;
double sum=0;
for(int i=1;i<=n;i++)
{
c[i]=a[i]-mid*b[i];
}
sort(c+1,c+1+n);
for(int i=k+1;i<=n;i++)
{
sum+=c[i];
}
if(sum>0){l=mid;}
else r=mid;
}
ans=mid*100;
printf("%.0f\n",ans);
}
return 0;
}