分析
这个就是典型的01分数规划,最最普通的那种
(题外话:poj真的有毒……不要用 lf 输出)
而且我也不知道怎么讲啊……
直接上代码吧
代码
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#define N 1009
#define eps 1e-10
using namespace std;
int n,k,a[N],b[N];
double c[N];
bool check(double r){
double ans=0;
for(int i=1;i<=n;++i) c[i]=a[i]-r*b[i];
sort(c+1,c+n+1);
for(int i=n;i>k;--i) ans+=c[i];
if(ans>=0) return 1;
return 0;
}
int main(){
while((scanf("%d%d",&n,&k)),n|k){
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=n;++i) scanf("%d",&b[i]);
double l=0,r=1,ans;
/*int t=50;
while(t--){//针对浮点数这类的二分,最好限定二分次数,不然很容易死掉
double mid=(l+r)/2.0;
if(check(mid)) ans=mid,l=mid+1;
else r=mid-1;
}*/
while(r-l>1e-6)
{
double mid=(l+r)/2;
if(check(mid)) l=mid; else r=mid;
}
printf("%.0f\n",100*l);//然后poj真的有毒,千万不要用lf输出
}
return 0;
}