其他分享
首页 > 其他分享> > 洛谷[P3743] kotori的设备

洛谷[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