k远远超过$ 10^8 $,不可能依次算出来,考虑二分答案,验证是否有足够多的浓度达到要求,如果有,那么答案更大,否则更小。
怎么统计有多少组合浓度达到m呢?
$ \frac a b \times \frac c d => \frac {a+c} {b+d} \ge m$
$ a+c \ge m(b+d) => a-mb >= md-c$
计算出md-c,依次枚举第一种糖水,二分查找统计有多少个小于等于a-mb的即可。

#include <bits/stdc++.h>
#define N 50050
using namespace std;
int i, j, k, x, y, a[N], b[N], c[N], d[N];
long long n, s;
double l, r, m, t, v[N];
int gou(){
    for(i=1; i<=y; i++){
        v[i] = m*d[i] - c[i];
    }//a-mb >= md-c
    sort(v+1, v+y+1);
    for(s=0, i=1; i<=x; i++){
        k = upper_bound(v+1, v+y+1, a[i]-m*b[i]) - v;
        s += k - 1;
    }//小于等于a[i]-m*b[i]即可
    return s >= n;
}
int main(){
    scanf("%d%d%lld", &x, &y, &n);
    for(i=1; i<=x; i++){
        scanf("%d%d", &a[i], &b[i]);
        b[i] += a[i];
    }
    for(i=1; i<=y; i++){
        scanf("%d%d", &c[i], &d[i]);
        d[i] += c[i];
    }
    l = 0, r = 1;
    while(r-l > 1e-13){
        m = (l+r) / 2;
        if(gou()) l = m;
        else r = m;
    }//二分浓度
    printf("%.10lf\n", r*100);
    return 0;
}

作者 crxis

发表回复