题意:从n个东西里面取还剩k个东西使它们的平均值最大。
思路:典型平均值最大化 问题,标准解法二分,这里是剩下k个,所以取n-k个东西。
详见挑战程序设计143页。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[1010],b[1010];
int n,k;
bool check(double x)
{
double c[1010];
for(int i=0;i<n;i++) c[i]=a[i]-x*b[i];
sort(c,c+n);
double sum=0;
for(int i=n-1;i>=n-k;i--) sum+=c[i];
return sum>=0;
}
int main()
{
while(~scanf("%d%d",&n,&k)){
if(n==0&&k==0) break;//避免n=1,k=0的情况
k=n-k;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<n;i++) scanf("%d",&b[i]);
double l=0,r=1.0;
for(int i=0;i<100;i++){
double mid=(l+r)*0.5;
if(check(mid)) l=mid;
else r=mid;
}
printf("%.0f\n",(l*100));
}
}