题意就是解一个方程: ∑ni=1disi+c=T 。我们发现随着c的增大,左面的值单调递减。因此我们可以对答案二分。复杂度 log21e15 左右吧。注意一下最小是要处理出来的。因为速度非负。
#include <cstdio>
#include <cstring>
#define N 1005
#define eps 1e-9
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline int min(int x,int y){return x<y?x:y;}
int n,T,d[N],s[N],mn=1005;
inline double calc(double x){
double res=0;
for(int i=1;i<=n;++i) res+=d[i]*1.0/(s[i]*1.0+x);
return res;
}
int main(){
// freopen("a.in","r",stdin);
n=read();T=read();
for(int i=1;i<=n;++i) d[i]=read(),s[i]=read(),mn=min(mn,s[i]);
double l=-mn,r=1e6+1000;
while(r-l>=eps){
double mid=(l+r)/2;
if(calc(mid)>=T) l=mid;
else r=mid;
}
printf("%.9lf\n",(r+l)/2);
return 0;
}