正题
题目大意
nnn段路,每一段路速度是vi+dv_i+dvi+d,长度是sis_isi,在ttt秒跑完了,求ddd的值。
解题思路
指数域二分,然后判断是否跑完即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1100;
const double eps=1e-14;
int n;
double s[N],v[N],t;
bool check(double x)
{double ans=0;for(int i=1;i<=n;i++){if(v[i]+x<=0) return 0;ans+=s[i]/(v[i]+x);}return (ans<=t);
}
int main()
{scanf("%d%lf",&n,&t);for(int i=1;i<=n;i++)scanf("%lf%lf",&s[i],&v[i]);double l=-1e8,r=1e8;for(int i=1;i<=100000;i++){double mid=(l+r)/2.0;if(check(mid)) r=mid;else l=mid;}if(l<eps&&-l<eps) printf("%.12lf",0);else printf("%.12lf",l);
}