专栏文章
题解:CF772A Voltage Keepsake
CF772A题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mio0dqtu
- 此快照首次捕获于
- 2025/12/02 11:18 3 个月前
- 此快照最后确认于
- 2025/12/02 11:18 3 个月前
题目的意思很好理解,在这里不做说明。
二分答案
如果需要使用二分答案,必须要满足单调性。
如果 的时间满足题目的条件,那么小于 的时间一定满足,这就满足了单调性。
-
二分范围:因为时间不能是负数所以将左边界设为 ,右边界设置为很大的值,因为是时间越来越小才能更加满足条件。
-
判断是否满足条件:二分过程中对 判断是否合法。遍历每个设备,若某一个设备在 时间消耗能量大于初始能量,接下来计算出充电宝需补充的能量并求和,最后对比充电宝提供能量与总补充能量需求。
输出答案
如果 满足条件则记录 在二分后输出,如果答案是很大的值那就说明一直满足,可以无限使用,输出 。
给出代码
CPP#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,p;
int a[N],b[N];
double l,r=1e10;
bool check(double z){//判断z是否合法
double s=0;
for(int i=1; i<=n; i++){
if(a[i]*z>b[i]){
s+=a[i]*z-b[i];
}
}
return p*z>=s;
}
int main() {
scanf("%d%d",&n,&p);
for(int i=1; i<=n; i++){
scanf("%d%d",&a[i],&b[i]);
}
while(r-l>=0.0000001){
double mid=(l+r)/2;
if(check(mid)==true){//此时的mid合法
l=mid;
}
else{
r=mid;
}
}
if(r==1e10){
printf("-1\n");//可以无限使用
} else {
cout << r;
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...