题意同
poj 3111 (只有一点点区别 )
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int maxn = 1000 + 10; int a[maxn], b[maxn]; struct node { double val; bool operator < (const node& rhs) const { return val > rhs.val; } }; node f[maxn]; int n, k; //sigma(ai)/sigma(bi) >= x //-> sigma(ai - x*bi) >= 0 int ok(double x) { for(int i=0; i<n; ++i) { f[i].val = a[i] - x*b[i]; } sort(f, f+n); double sum = 0; for(int i=0; i<k; ++i) { sum += f[i].val; } return sum >= 0; } int main() { while(~scanf("%d%d", &n, &k)) { if(n==0 && k==0) break; 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; //for(int i=0; i<50; ++i) { while(r-l>1e-8) { double mid = (l+r)/2; if(ok(mid)) l = mid; else r = mid; } printf("%d\n", (int)(l*100 + 0.5) ); //printf("%.f\n", l*100); 系统默认也是向上取整 } return 0; }