题意
已知ti,vi,si,t
求解方程
t1*(d+v1)=s1
t2*(d+v2)=s2
t3*(d+v3)=s3
…
t1+t2+t3+…+tn=t
思路
可以发现 ∑ s i / ( d + v i ) = t \sum si/(d+vi)=t ∑si/(d+vi)=t,且结果是随着d的增减而增减的,满足单调性,故二分答案即可。
代码
#include <cmath>
#include <cstdio>
int n;
double t;
double s[1001], v[1001];
int check(double d) {
double res = 0;
for (int i = 1; i <= n; i++) {
if (d + v[i] <= 0) return 1;
res += s[i] / (d + v[i]);
}
return res > t;
}
int main() {
scanf("%d %lf", &n, &t);
for (int i = 1; i <= n; i++)
scanf("%lf %lf", &s[i], &v[i]);
double l = -1e9, r = 1e9, mid;
for (int i = 0; i < 100; i++) {
mid = (l + r) / 2.0;
if (check(mid)) l = mid;
else r = mid;
}
if(fabs(l) < 1e-14) l = 0;
printf("%.12lf", l);
}