本文主要是介绍A. Voltage Keepsake,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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;elselow =mid;}printf("%.10lf\n",mid);return 0;
}
这篇关于A. Voltage Keepsake的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!