题目链接:C. Voltage Keepsake
题解:二分时间,然后判断看需要充电的时间总和是否在允许的范围内
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define PI 3.14159265
#define eps 1e-7
using namespace std;
const int maxn=1e5+5;
int n,tmp1,p;
int a[maxn],b[maxn];
bool judge(double t)
{
double q=0.0;
for(int i=0;i<n;i++)
{
if(a[i]*t>b[i])
{
q+=(a[i]*t-b[i])/p;
}
}
return q<=t;
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>p;
ll sum=0;
for(int i=0;i<n;i++)
{
cin>>a[i]>>b[i];
sum+=a[i];
}
if(p>=sum)
{
cout<<-1<<'
';return 0;
}
double l=0.0,r=1e13+7;
while(r-l>eps)
{
double mid=(r+l)/2;
if(judge(mid))
{
l=mid;
}
else
{
r=mid;
}
}
cout<<(l+r)/2<<endl;
return 0;
}