直接二分即可,右端点的初始值要设大一些,然后直接循环若干次,若大于一个足够大的数就输出-1,否则就输出左端点
#include<bits/stdc++.h>
using namespace std;
int n,p,a[100005],b[100005];
double l=0,r=1e15;
bool check(double x)
{
double ret=0;
for(int i=0;i<n;i++)ret+=max((x*a[i]-b[i])/p,0.0);
return ret<=x;
}
int main()
{
scanf("%d%d",&n,&p);
for(int i=0;i<n;i++)scanf("%d%d",&a[i],&b[i]);
for(int i=0;i<200;i++)
{
double m=(l+r)/2;
if(check(m))l=m;
else r=m;
}
if(l>1e14)cout<<-1;
else printf("%.10lf",l);
return 0;
}