学习博客:传送门
POJ 2976模板题、
#include <cstdio>
#include <cstring>
#include <cmath>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <string>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <utility>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define ft first
#define sd second
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int qq = 1000 + 10;
const int MOD = 1e9 + 7;
const int INF = 1e9 + 10;
const double eps = 1e-7;
double a[qq], b[qq];
double d[qq];
int n, k;
double Check(double L) {
double sum = 0;
for(int i = 0; i < n; ++i) {
d[i] = a[i] - b[i] * L;
}
sort(d, d + n);
for(int i = k; i < n; ++i) {
sum += d[i];
}
return sum;
}
int main(){
while(scanf("%d%d", &n, &k) != EOF) {
if(!n && !k) break;
for(int i = 0; i < n; ++i) {
scanf("%lf", a + i);
}
double l = INF, r = -INF;
for(int i = 0; i < n; ++i) {
scanf("%lf", b + i);
l = min(l, a[i] * 1.0 / b[i]);
r = max(r, a[i] * 1.0 / b[i]);
}
double ans = l;
while(r - l > eps) {
double mid = (l + r) / 2.;
if(Check(mid) > 0) {
ans = mid;
l = mid;
} else {
r = mid;
}
}
printf("%.0f\n", ans * 100.);
}
return 0;
}