【题目】http://codeforces.com/problemset/problem/801/C
【题意】现在有n台机器,每台机器都有各自的每秒用电量ai和初始电量bi。现在你有一个充电器,每秒能给某台机器充p的电。现在问最长能让这些机器同时工作多长时间?如果能一直工作输出-1。
【思路】将时间二分,如果 当前时间的总用电量<
,增加时间,如果
>
,减少时间。
【代码】
#include<bits/stdc++.h>
//#define
using namespace std;
typedef long long ll;
const double inf=1e12;
const int M=1e5+5;
const double eps=1e-4;
double a[M];
double b[M];
int main()
{
int n,p;
cin>>n>>p;
double suma=0,sumb=0;
for(int i=0; i<n; i++)
{
scanf("%lf",&a[i]);
suma+=a[i];
scanf("%lf",&b[i]);
sumb+=b[i];
}
//cout<<suma<<" "<<sumb<<endl;
if(p>=suma)
{
printf("-1\n");
return 0;
}
double t1,t2;
t1=0,t2=inf;
while(t2-t1>=eps)//二分时间
{
double mid=(t2+t1)/2;
double csm=0;
for(int i=0; i<n; i++)
{
///csm:当前时间下,总共需要充进多少电
csm+=max(0.0,mid*a[i]-b[i]);
//如果初始电比当前时间花的电多那么就是0
}
if(csm/mid<p)
{
t1=mid;
}
else
t2=mid;
}
if(t2!=inf)
cout<<t2;
else
cout<<-1;
}