后六个数据有五个SF????
#include <cstdio>
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 100010;
typedef pair<double, double> PII;
int n, p;
PII a[N];
bool cmp(PII& a, PII& b)
{
return a.second * b.first <= b.second * a.first;
}
bool check(double x)
{
double sum = 0, tol = 0;
for (int i = 0; i < n; ++ i)
{
sum += a[i].first, tol += a[i].second;
// cout << x << " " << tol / (sum - p) << endl;
if (tol < x * (sum - p)) return true;
}
return false;
}
// int check(double ans)
// {//验证答案
// double q=p*ans;//充电器最多提供的能量
// double sum=0;
// for(int i=0;i<n;i++){
// if(a[i].first*ans<=a[i].second){//若设备已有的能量大于使用时间需要的能量
// continue;//忽略该设备
// }
// sum+=(a[i].first*ans-a[i].second);//否则用充电器充电,使设备已有的能量等于使用时间需要的能量,并记录需要的能量。
// }
// return sum<=q;//最后比较需要的能量总和和充电器最多提供的能量。
// }
int main()
{
scanf("%d%d", &n, &p);
double sum = 0;
for (int i = 0; i < n; ++ i)
{
cin >> a[i].first >> a[i].second;
sum += a[i].first;
}
if (p >= sum)
{
cout << -1;
return 0;
}
sort(a, a + n, cmp);
double l = 0, r = 1e10;
while (r - l > 1e-6)
{
// cout << "l:" << l << " r: " << r << endl;
double mid = (l + r) / 2;
// cout << mid << " ";
if (check(mid)) r = mid;
else l = mid;
}
printf("%.10lf\n", l);
return 0;
}