ABC294F
最初に
濃度を固定した方が簡単. また,2つしか混ぜない.
解法 0
自然な解法. 濃度 \(z\) を固定したとき, 2つの砂糖水 \(i \in N, j \in M\) を混ぜて濃度を \(z\) 以上に出来ることは, \[ \frac{a_{i} + c_{j}}{a_{i} + b_{i} + c_{j} + d_{j}} \geq z \] と同値. これを \(i,j\) に分離すると, \[ a_{i} - z(a_{i} + b_{i}) \geq -(c_{j} + z(c_{j} + d_{j})) \cdots (*) \] と書ける. 右辺を \(e_{j}\) とおいて, \(e := [e_{j}]_{j \in M} \) をソートする.
\(i \in N\) を固定すれば,\*1;
ll cnt = 0;
rep(i,n){
auto it = upper_bound(all(e), a[i] - mid*(a[i] + b[i]));
cnt += it - e.begin();
}
if(cnt >= k) ok = mid;
else ng = mid;
}
printf("%.10lf\n", ok*100);
return 0;
}
// 解法 1 -----------------------------
int main() {
ll n,m,k;
cin >> n >> m >> k;
vll a(n), b(n);
rep(i,n){
cin >> a[i] >> b[i];
}
vll c(m), d(m);
rep(i,m){
cin >> c[i] >> d[i];
}
double ok = 0, ng = 1;
rep(i,100){
double mid = (ok + ng) / 2.;
double z = mid/(1-mid);
vector<double> e(m); rep(i,m) e[i] = -c[i] + z*d[i];
sort(all(e));
ll cnt = 0;
rep(i,n){
auto it = upper_bound(all(e), a[i] - z*b[i]);
cnt += it - e.begin();
}
if(cnt >= k) ok = mid;
else ng = mid;
}
printf("%.10lf\n", ok*100);
return 0;
}