http://codeforces.com/contest/801/problem/C
有一个充电器和n个手机,手机剩余电量b[i],消耗电量速度a[i]每秒,p为充电器每秒可以充的电量。
只要充电器充的电量+剩余的电量>=消耗的电量就可以使用,二分。
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <stdlib.h>
#include <list>
#include <queue>
#include <map>
#include <stack>
#include <set>
#define inf 1e18
#define eps 1e-4
#define PI acos(double(-1))
using namespace std;
typedef long long ll;
typedef long double ld;
const int maxn=1e5+10;
int n,p,a[maxn],b[maxn];
ld mid,r=inf,l=0;
ll sum=0;
int check()
{
ld ans=mid*p,need=0;
for(int i=0;i<n;i++)
{
need=b[i]-a[i]*mid;
if(need<0)
{
ans+=need;
}
if(ans<0)
return 0;
}
return 1;
}
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<n;i++)
sum+=a[i];
if(sum<=p)
{
cout << "-1" << endl;
return 0;
}
while(r-l>=eps)
{
mid=(l+r)/2;
if(check())
l=mid;
else
r=mid;
}
printf("%.9lf\n",(double)mid);
return 0;
}