01分数规划,sort+二分即可。注意精度问题,这种四舍五入的问题一般都是两种处理方法:1、printf("%.0lf\n",ans); 2、printf("%d\n",(int)(ans+0.5));
#include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define N 1010 double a[N],b[N],c[N]; int n,K; int main() { int i; double left,right,mid,sum; while(scanf("%d%d",&n,&K),n||K) { for(i = 1; i <= n; i++) scanf("%lf",&a[i]); for(i = 1; i <= n; i++) scanf("%lf",&b[i]); left = 0; right = 1; while(1) { if(fabs(left-right) < 0.0001) break; mid = (left+right)/2; for(i = 1; i <= n; i++) c[i] = a[i] - mid*b[i]; sort(c+1,c+1+n); sum = 0; for(i = K+1; i <= n; i++) sum += c[i]; if(sum > 0) left = mid; else right = mid; } left = left*100; printf("%.0f\n",left); } return 0; }