题意
给出数列aaa和bbb,在里面选取kkk个,使得∑ai/∑bi\sum a_i/\sum b_i∑ai/∑bi最大。
思路
我们可以设答案为ansansans,就是
∑ai/∑bi=ans\sum a_i/\sum b_i=ans∑ai/∑bi=ans
那么∑ai=∑bi∗ans\sum a_i=\sum b_i*ans∑ai=∑bi∗ans
所以∑(ai−bi∗ans)=0\sum (a_i-b_i*ans)=0∑(ai−bi∗ans)=0
然后因为我们选或不选会改变答案的大小,所以我们可以发现这是有单调性的,所以我们可以二分答案,然后判断选中的这些数是否能满足条件。
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
int n, k;
int a[100001], b[100001];
double c[100001];
int check(double x) {
memset(c, 0, sizeof(c));
for (int i = 1; i <= n; i++)
c[i] = a[i] - b[i] * x;
std::sort(c + 1, c + 1 + n);
double s = 0;
for (int i = n; i > n - k; i--)
s += c[i];
return s >= 0;
}
int main() {
scanf("%d %d", &n, &k);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &b[i]);
double l = 1e-5, r = 1000;
while (l + 1e-5 < r) {
double mid = (l + r) / 2;
if (check(mid)) l = mid;
else r = mid;
}
printf("%.3lf", l);
}