洛谷[P3743] kotori的设备
作者:互联网
题目描述
第 i 个设备每秒消耗ai个单位能量。能量的使用是连续的,也就是说能量不是某时刻突然消耗的,而是匀速消耗。也就是说,对于任意实数 ,在 k 秒内消耗的能量均为k*ai 单位。在开始的时候第 i 个设备里存储着bi个单位能量。
同时 kotori 又有一个可以给任意一个设备充电的充电宝,每秒可以给接通的设备充能p 个单位,充能也是连续的,不再赘述。你可以在任意时间给任意一个设备充能,从一个设备切换到另一个设备的时间忽略不计。
kotori 想把这些设备一起使用,直到其中有设备能量降为 0。所以 kotori 想知道,
在充电器的作用下,她最多能将这些设备一起使用多久。
输入格式
第一行给出两个整数 n,p。
接下来 n 行,每行表示一个设备,给出两个整数,分别是这个设备的ai 和 bi。
总结
浮点数二分:
1)注意判断二分终止条件时,要仔细考察精度,盲目过精会有时间代价。
2)左右值的起始赋值应尽量直接囊括答案可能范围。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 6 using namespace std; 7 8 int n, p, a[200000], b[200000]; 9 double ms = -1.0; 10 11 inline bool check(double h) 12 { 13 double cs = 0; 14 for (int i = 1; i <= n; ++i) 15 { 16 double cc = h * a[i] - b[i]; 17 if (cc < 0.0) continue; 18 cs += cc / p; 19 } 20 if (cs <= h) return true; 21 else return false; 22 } 23 24 double binery_search(double l, double r) 25 { 26 if (r - l <= 0.0001) return l; 27 double mid = (l + r) / 2.0; 28 if (check(mid)) return binery_search(mid, r); 29 else return binery_search(l, mid); 30 } 31 32 int main() 33 { 34 double sum = 0.0; 35 read(n), read(p); 36 for (int i = 1; i <= n; ++i) 37 read(a[i]), read(b[i]), sum += a[i]; 38 ms = 1e10; 39 if (sum <= p) cout << "-1"; 40 else cout << binery_search(0, ms); 41 return 0; 42 }
标签:洛谷,kotori,double,ai,能量,include,P3743,设备 来源: https://www.cnblogs.com/christopheryan/p/15330217.html