题目链接:http://codeforces.com/problemset/problem/801/C点击打开链接
如果一直不存在输出-1
很容易想到 当p大于等于所有充电宝耗电效率之和时 就是-1
对于此题 用模拟来做很明显超时
一开始就想到了对时间二分 但是对上界不知范围 加上不会把控判断的条件就搜题解了。。
上界定为1e18
当p*time+∑b[i]*time<time*∑a[i]时 time就比标准值大
但是因为这里问的是某一个充电宝到0的情况
因此判断时用变量sum记录总共充的电 对每一个充电宝判断在过完这个时间之后sum还有没有剩余 如果出现了sum<0的情况 说明是不够用的
#include <bits/stdc++.h>
using namespace std;
double n,p;
double a[111111];
double b[111111];
int judge(double time)
{
double sum=p*time;
for(int i=0;i<n;i++)
{
double mid=(b[i]-a[i]*time);
if(mid<0)
sum+=mid;
if(sum<0)
return 0;
}
return 1;
}
int main()
{
cin >> n >> p;
double sum=0;
for(int i=0;i<n;i++)
{
cin >> a[i] >> b[i];
sum+=a[i];
}
if(p>=sum)
{
cout << "-1" << endl;
return 0;
}
double ans=0;
double l=0;
double r=1e18;
while(r-l>=1e-4)
{
double mid=(l+r)/2;
if(judge(mid))
{
ans=mid;
l=mid;
}
else
r=mid;
}
printf("%lf",ans);
}