CodeForces - 800A
题意 就是有n个设备每个设备有一定的电量但是只要开启就会每个单位时间消耗固定的电量,还有一个充电器 这个充电器能够随意插拔并且忽略插拔时间,然后要同时运行这n个设备,只要有一个设备没电了 就结束,问你可以运行多长时间 ! <如果能够一直运行则输出-1>
思想
这个题暴力是不存在的 于是乎采用了在一个数据域上不断二分的思想 并写了一个检查函数
如果生成的时间(mid)长了 就采用下半个数据域 如果生成的时间短了就采用上半个数据域 直到 这个数据域 区间少于1e-4就输出mid
代码
#include<cstdio>
int a;
int n,batter;
long long sum;
double low =0;
double high = 1e18;
int data1[100002];
int data2[100002];
bool change(double mid)
{
double X = mid*batter;
for(int i=0;i<n;i++)
{
double e = data2[i]-mid*data1[i];
if(e<0)
X+=e;
if(X<0)
return true;
}
return false;
}
int main()
{
scanf("%d%d",&n,&batter);
int b;
sum=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&data1[i],&data2[i]);
sum+=data1[i];
}
if(sum<=batter)
{
printf("-1\n");
return 0;
}
double mid;
while(high-low>1e-4)
{
mid = (high+low)/2;
if(change(mid))
high = mid;
else
low =mid;
}
printf("%.10lf\n",mid);
return 0;
}