/* 01分数规划模板(Dinkelbach) 01分数规划就是把 sum(a)/sum(b)转换成 f(x)=sum(a)-ans*sum(b); 当f(x)取到0时,ans取到了最大(小)值 poj 2976 两个长度为n的数组a,b 可以除去m个,怎样选择才能使剩下的 sum(a)/sum(b)的百分数最大 */ int n,m; struct Node{ int a,b; double v; ///用于排序筛选较大的值(题目要求极大值 bool operator<(const Node&a)const{ return v<a.v; } }node[N]; double d[N]; double check(double ans){ for(int i=1;i<=n;++i)node[i].v=node[i].a-ans*node[i].b; sort(node+1,node+n+1); double c=0,_b=0; for(int i=m+1;i<=n;++i){ c+=node[i].a; _b+=node[i].b; } return c/_b; ///模拟sum(a)/sum(b) } int main(){ int i,j,group,temp; while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){ for(i=1;i<=n;++i)scanf("%d",&node[i].a); for(i=1;i<=n;++i)scanf("%d",&node[i].b); double ans,temp=0;///temp用于校验答案,初始为任意值均可 do{ ans=temp; temp=check(ans); }while(fabs(ans-temp)>1e-4); ///根据题目要求改精度 printf("%.0f ",ans*100); ///原题是百分数所以*100 } return 0; }