[关闭]
@guxier 2022-04-07T17:54:08.000000Z 字数 1579 阅读 469

kotori的设备

洛谷 二分


题目描述

kotori 有 n 个可同时使用的设备。

第 i 个设备每秒消耗ai个单位能量。能量的使用是连续的,也就是说能量不是某时刻突然消耗的,而是匀速消耗。也就是说,对于任意实数 ,在 k 秒内消耗的能量均为 单位。在开始的时候第 i 个设备里存储着个单位能量。

同时 kotori 又有一个可以给任意一个设备充电的充电宝,每秒可以给接通的设备充能p 个单位,充能也是连续的,不再赘述。你可以在任意时间给任意一个设备充能,从一个设备切换到另一个设备的时间忽略不计。 kotori 想把这些设备一起使用,直到其中有设备能量降为 0。所以 kotori 想知道,

在充电器的作用下,她最多能将这些设备一起使用多久。

输入格式

第一行给出两个整数 n,p。

接下来 n 行,每行表示一个设备,给出两个整数,分别是这个设备的

输出格式

如果 kotori 可以无限使用这些设备,输出-1。

否则输出 kotori 在其中一个设备能量降为 0 之前最多能使用多久。

设你的答案为 a,标准答案为 b,只有当 a,b 满足  的时候,你能得到本测试点的满分。

输入输出样例

输入 #1

  1. 2 1
  2. 2 2
  3. 2 1000

输出 #1

  1. 2.0000000000

输入 #2

  1. 1 100
  2. 1 1

输出 #2

  1. -1

输入 #3

  1. 3 5
  2. 4 3
  3. 5 2
  4. 6 1

输出 #3

  1. 0.5000000000

说明/提示

对于 100%的数据,


二分+贪心

  1. #include <bits/stdc++.h>
  2. #define rep(i, a, n) for (int i = a; i <= n; i++)
  3. #define per(i, a, n) for (register int i = n; i >= a; i--)
  4. #define debug(x) cout << #x << ": " << x << endl
  5. #define fi first
  6. #define se second
  7. using namespace std;
  8. typedef long long LL;
  9. typedef pair<int,int> PII;
  10. /*******************Guxier*******************/
  11. const int N = 1e6 + 10;
  12. double n , k , m , a[N] , b[N] ;
  13. inline bool check(double x)
  14. { //使用时间为x时
  15. double sum = 0;
  16. rep(i , 1 , n)
  17. {
  18. //设备已有的能量大于使用时间需要的能量,忽略该设备。
  19. if(b[i] >= x * a[i]) continue;
  20. sum += x * a[i] - b[i];
  21. //记录需要的能量。
  22. }
  23. if(sum > m * x) return false;
  24. return true;//最后比较需要的能量总和和充电器最多提供的能量。
  25. }
  26. double bsearch()
  27. {
  28. double l = 0 , r = 1e10;
  29. while(r - l > 1e-6)
  30. {
  31. double mid = (l + r) / 2.0;
  32. if(check(mid)) l = mid;
  33. else r = mid;
  34. }
  35. return l;
  36. }
  37. int main()
  38. {
  39. /*ifstream fin("IN.in");
  40. ofstream fout("OUT.out" , ios::out);
  41. // puts("===============Success Run!===============");
  42. */
  43. double sum = 0;
  44. cin >> n >> m;
  45. rep(i , 1 , n) cin >> a[i] >> b[i] , sum += a[i];
  46. if(sum <= m) //特判所有设备的消耗能量速度总和还是小于充电速度,输出-1
  47. {
  48. cout << -1.000000 ;
  49. return 0;
  50. }
  51. cout << bsearch();
  52. puts("");
  53. /*fin.close();
  54. fout.close();*/
  55. return 0;
  56. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注