当前位置: 首页 > news >正文

二分答案#贪心

 

1. 完整
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN=1e5+50,MAXX=1e10;
const double MINN=1e-6;LL N,P,a[MAXN],b[MAXN];
double sum=0,Ans=-1;double cost(LL a[],LL b[],LL L,LL R,double x){double sum=0;for(int i=L;i<=R;i++){double temp=a[i]*x;if(temp>b[i]) sum+=temp-b[i];}return sum;
}void Init(){scanf("%lld%lld",&N,&P);for(int i=1;i<=N;i++) scanf("%lld%lld",&a[i],&b[i]),sum+=a[i];
}
void Solve(){if(sum<=P) return;double l,mid,r;for(l=0,r=MAXX,mid=(l+r)/2;r-l>MINN;mid=(l+r)/2){double temp=cost(a,b,1,N,mid);if(P*mid>=temp) l=mid;else r=mid-MINN;}Ans=l;
}void Print(){printf("%.10lf\n",Ans);
}int main()
{Init();Solve();Print();return 0;
}
2. 全局变量声明
LL N, P, a[MAXN], b[MAXN];
double sum = 0, Ans = -1;
  • N 用于存储设备的数量,P 存储充电宝每秒的充电量;a 数组存储每个设备的能量消耗速率,b 数组存储每个设备初始的能量;sum 用于后续计算所有设备能量消耗速率的总和;Ans 用于存储最终计算得到的最长使用时间,初始化为 -1 表示还未计算出有效结果 。
3. cost 函数
double cost(LL a[], LL b[], LL L, LL R, double x) {double sum = 0;for (int i = L; i <= R; i++) {double temp = a[i] * x;if (temp > b[i]) sum += temp - b[i];}return sum;
}
  • 功能:计算在时间 x 秒内,从设备 L 到设备 R 这些设备总共需要额外补充的能量。因为每个设备每秒消耗 a[i] 能量,x 秒就消耗 a[i] * x 能量,如果这个消耗超过了设备初始存储的 b[i] 能量,那么超出部分就需要充电宝来补充,把所有设备超出的部分累加起来就是 sum ,也就是这段时间内充电宝需要提供的总充电量 。
  • 参数说明a[] 是设备能量消耗速率数组,b[] 是设备初始能量数组,L 和 R 限定计算的设备范围,x 是假设的使用时间。
  • 返回值:返回在时间 x 内,指定设备区间需要充电宝补充的总能量。
4. Init 函数
void Init() {scanf("%lld%lld", &N, &P);for (int i = 1; i <= N; i++) scanf("%lld%lld", &a[i], &b[i]), sum += a[i];
}
  • 功能:用于初始化数据,从标准输入读取设备数量 N 和充电宝每秒充电量 P ,然后依次读取每个设备的能量消耗速率 a[i] 和初始能量 b[i] ,同时累加所有设备的能量消耗速率到 sum 中,为后续判断是否能无限使用做准备 。
5. Solve 函数
void Solve() {if (sum <= P) return;double l, mid, r;for (l = 0, r = MAXX, mid = (l + r) / 2; r - l > MINN; mid = (l + r) / 2) {double temp = cost(a, b, 1, N, mid);if (P * mid >= temp) l = mid;else r = mid - MINN;}Ans = l;
}
  • 功能:核心的计算逻辑,用于求解设备最长共同使用时间。
    • 首先判断 sum(所有设备能量消耗速率总和)是否小于等于 P(充电宝每秒充电量),如果是,说明充电宝提供的电量足以弥补所有设备的消耗,设备可以无限使用,直接返回(此时 Ans 保持初始的 -1 ,后续 Print 函数会输出 -1 )。
    • 如果 sum > P ,则通过二分查找来确定最长使用时间。二分查找的思路是:假设使用时间为 mid ,计算在这 mid 时间内,所有设备需要充电宝补充的总能量 temp(通过 cost 函数计算),然后看充电宝在 mid 时间内总共能提供的电量 P * mid 是否能满足 temp 。如果能满足(P * mid >= temp ),说明可以尝试更长的使用时间,调整二分查找的左边界 l = mid ;如果不能满足,说明当前假设的 mid 太大了,需要调小,调整右边界 r = mid - MINN 。不断重复这个过程,直到二分查找的区间长度小于 MINN ,此时认为找到了足够精确的结果,把左边界 l 的值赋给 Ans ,作为最终的最长使用时间 。

 


文章转载自:
http://captor.sxnf.com.cn
http://astrographic.sxnf.com.cn
http://alternating.sxnf.com.cn
http://animalcule.sxnf.com.cn
http://astrologian.sxnf.com.cn
http://blasted.sxnf.com.cn
http://acquitment.sxnf.com.cn
http://bethanechol.sxnf.com.cn
http://alcides.sxnf.com.cn
http://bassoonist.sxnf.com.cn
http://alexandrite.sxnf.com.cn
http://bootery.sxnf.com.cn
http://candida.sxnf.com.cn
http://awlwort.sxnf.com.cn
http://arytenoid.sxnf.com.cn
http://billboard.sxnf.com.cn
http://calembour.sxnf.com.cn
http://castigator.sxnf.com.cn
http://amused.sxnf.com.cn
http://aide.sxnf.com.cn
http://assiduous.sxnf.com.cn
http://brewing.sxnf.com.cn
http://asunder.sxnf.com.cn
http://antiwhite.sxnf.com.cn
http://acrocentric.sxnf.com.cn
http://bromoform.sxnf.com.cn
http://arthrodesis.sxnf.com.cn
http://antiviral.sxnf.com.cn
http://anyplace.sxnf.com.cn
http://blaff.sxnf.com.cn
http://www.dtcms.com/a/281621.html

相关文章:

  • Python的requests包中使用session管理cookie
  • 无人机故障响应模块运行与技术难点
  • 知识蒸馏 是什么?具体怎么实现的
  • 防抖与节流
  • JavaScript认识+JQuery的依赖引用
  • 手撕线程池详解(C语言源码+解析)
  • 35.KMP 算法
  • 分发糖果-leetcode
  • Kafka亿级消息资源组流量掉零故障排查
  • 【LLIE专题】通过通道选择归一化提升模型光照泛化能力
  • MySQL 8.0 OCP 1Z0-908 题目解析(25)
  • 【QT】实现应用程序启动画面
  • 笔试——Day9
  • linux kernel的错误编码指针详细介绍
  • 【深度学习新浪潮】什么是任意倍率超分?
  • 知识库信息切片,AI降本增效的利刃
  • Unity灯光面板环境设置
  • [Python] -实用技巧6-Python中with语句和上下文管理器解析
  • 身份核验自动化-姓名身份证号二要素核验接口-API实名验证
  • 计算机系统方向可发会议/期刊参考时间
  • CF1916D Mathematical Problem 题解
  • 数据结构——顺序表的相关操作
  • TypeScript之旅
  • 读取ubuntu的磁盘分区表与超级块
  • 万字长文深度解析:AI搜索范式背后的四大核心模块
  • Typescript 泛型
  • 智慧跳绳全方案:三模无线+姿态感知,低功耗高精度芯片选型指南OM6626/SI24R2E
  • 【flex布局】
  • Python实现按数字命名合并文本文件
  • 推客小程序开发全景指南:从商业模式到用户体验的完整方法论