[ABC294F] Sugar Water 2题解
题意简述
高桥君有
现在高桥君随意选出一瓶水,青木君也随意选出一瓶水,混合在一起,这样总共有
解题思路
本题数据范围
题目中问我们浓度第
下面问题就是,当给定浓度的时候,如果求出浓度比它大的方案数呢?
首先对于青木君的
接下来枚举高桥君的
这样排序复杂度
代码示例
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll MAXN = 1e5 + 5;
const ll MOD = 1e9 + 7;
ll n, m, k;
double a[MAXN], b[MAXN], c[MAXN], d[MAXN], more[MAXN];
//计算浓度大于mid的方案数
ll check(double cc) {
//浓度是cc,对于m个瓶子,水是y,则糖需要cc * y / (1 - cc)
//多余的糖是x - cc * y / (1 - cc),把每个瓶子中多余的糖放到more数组里
for (int i = 0; i < m; ++i) {
more[i] = c[i] - cc * d[i] / (1 - cc);
}
//按照多余的糖排序
sort(more, more + m);
ll cnt = 0;
//遍历n个瓶子,对于每个瓶子,计算它缺少的糖
for (int i = 0; i < n; ++i) {
double less = -(a[i] - cc * b[i] / (1 - cc));
//二分查找,找到所有多余的糖比less多的个数
ll t = more + m - upper_bound(more, more + m, less);
cnt += t;
}
return cnt;
}
int main() {
cin >> n >> m >> k;
for (int i = 0; i < n; ++i) {
cin >> a[i] >> b[i];
}
for (int i = 0; i < m; ++i) {
cin >> c[i] >> d[i];
}
//二分排名第k的浓度
double low = 0, high = 1, mid;
for (int i = 0; i < 100; ++i) {
mid = (low + high) / 2;
if (check(mid) < k) {
high = mid;
} else {
low = mid;
}
}
printf("%.15lf\n", high*100);
return 0;
}