白书上的一道裸题,也叫01分数规划
通过枚举最大单位分数,进行贪心,二分多跑几次保证精度足够
https://vjudge.net/contest/287900#problem/B
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
#define ll long long
#define mod 1000000007
#define inf 0x3f3f3f3f
using namespace std;
double a[1005], b[1005], c[1005];
int n, k;
bool cmp(double a, double b)
{
return a > b;
}
bool C(double x)
{
for(int i = 1; i <= n; i ++)
c[i] = a[i] - x * b[i];
sort(c + 1, c + 1 + n, cmp);
double sum = 0;
for(int i = 1; i <= n - k; i ++)
sum += c[i];
if(sum >= 0) return 1;
return 0;
}
int main()
{
while(scanf("%d%d", &n, &k) != EOF && (n + k))
{
for(int i = 1; i <= n; i ++)
scanf("%lf", &a[i]);
for(int i = 1; i <= n; i ++)
scanf("%lf", &b[i]);
double l = 0, r = inf * 1.0;
for(int i = 1; i <= 100; i ++)
{
double mid = (l + r) / 2;
if(C(mid)) l = mid;
else r = mid;
}
printf("%.0f\n", l * 100);
}
return 0;
}