#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAXN = 1000 + 5;
const double EPS = 1e-7;
struct Node {
int a, b;
double w;
//bool choose;
void clear()
{
a = b = 0;
w = 0;
//choose = false;
}
} N[MAXN];
bool cmp(Node u, Node v)
{
return u.w > v.w;
}
int n, k;
bool g(double r)
{
for (int i = 0; i < n; i++)
{
N[i].w = N[i].a - N[i].b * r;
}
sort(N, N + n, cmp);
// for (int i = 0; i < n; i++)
// {
// printf("%f ", N[i].w);
// }
// printf("\n");
// for (int i = 0; i < n - k; i++)
// {
// N[i].choose = true;
// }
double res = 0;
for (int i = 0; i < n - k; i++)
{
res += N[i].w;
//printf("%lf ", res);
}
//printf("\n");
//printf("% lf !\n", res);
if (res >= EPS) return true;
return false;
}
int main()
{
while (scanf("%d %d", &n, &k))
{
if (n == 0 && k == 0) return 0;
for (int i = 0; i < n; i++)
{
N[i].clear();
}
for (int i = 0; i < n; i++)
{
scanf("%d", &N[i].a);
}
for (int i = 0; i < n; i++)
{
scanf("%d", &N[i].b);
}
double L = 0, R = 1, mid;
while ((R - L) >= EPS)
{
mid = (L + R) / 2;
//mid = L + (R - L) * 0.5;
//printf("%f~ \n", mid);
if (g(mid)) L = mid;
else R = mid;
}
// double ans = fabs(mid * 100);
// printf("%f\n", ans);
printf("%.0f\n", fabs(mid * 100));
//printf("%d\n", (int)round(fabs(L * 100)));
}
}
水题。。。然而我还是调了一下午+一晚上qnq
知道了0-1分数规划之后就写个二分就行了,并不难。
需要注意的就是精度问题和需不需要绝对值。精度最后设了1e-7,1e-4就不对,绝对值要认真考虑一下,看看到底需不需要。