原题链接:小鸟的设备 - 洛谷
目录
1. 题目描述
2. 思路分析
浮点数二分答案。
首先特判,如果接通设备每秒生成的能量p大于等于所有设备每秒消耗的能量(a[1]+a[2]+..+a[n])直接输出-1,并且return 0; 结束程序。
之后进行浮点数二分。令l=0,r=1e10(也就是对 时间 进行二分)。写上浮点数二分的模板(这个时候不用像整数二分那样对l,r进行+1或者-1操作)。自定义一个bool类型的check()函数,令生成的总能量为power=p*x,开一个sum变量并初始化为0。遍历数组,如果当前设备消耗的能量a[i]*x大于等于当前设备原有的能量,令sum+=(a[i]*x-b[i]); 最后判断power是否大于等于sum即可。
3. 代码实现
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 10;
double n, p, a[N], b[N];
bool check(double x) {
double power = p * x;
double sum = 0;
for (int i = 1; i <= n; i++) {
if (a[i] * x >= b[i]) sum += a[i] * x - b[i];
}
return power >= sum;
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> p;
double sum = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i] >> b[i];
sum += a[i];
}
if (p >= sum) {
cout << -1 << endl; return 0;
}
double l = 0, r = 1e10;
while (r - l > 1e-6) {
double mid = (l + r) / 2.0;
if (check(mid)) l = mid;
else r = mid;
}
cout << l << endl;
return 0;
}