二分查找:是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将目标值与数组中间的元素进行比较,如果目标值小于中间元素,则在数组的左半部分继续查找,否则在右半部分查找,不断缩小搜索范围,直到找到目标值或确定目标值不存在为止。二分查找的时间复杂度为O(logn),即查找效率较高。
# 某软件系统会在运行过程中持续产生日志,系统每天运行N单位时间,运行期间每单位时间产生的日志条数保行在数组records中。records[i]表示第i单位时间内产生日志条数。
# 由于系统磁盘空间限制,每天可记录保存的日志总数上限为total条。
# 如果一天产生的日志总条数大于total,则需要对当天内每单位时间产生的日志条数进行限流后保存,请计算每单位时间最大可保存日志条数limit,以确保当天保存的总日志条数不超过total。
# 对于单位时间内产生日志条数不超过limit的日志全部记录保存;
# 对于单位时间内产生日志条数超过limit的日志,则只记录保存limit条日志;
# 如果一天产生的日志条数总和小于等于total,则不需要启动限流机制.result为-1。
# 请返回result的最大值或者-1。
# 输入描述
# 第一行为系统某一天运行的单位时间数N,1<=N<=10^5
# 第二行为表示这一天每单位时间产生的日志数量的数组records[],0 <= records[i] <= 10^5
# 第三行为系统一天可以保存的总日志条数total。1 <= total <= 10^9
# 输出描述
# 每单位时间内最大可保存的日志条数limit,如果不需要启动限流机制,返回-1。
# 输入 6
# 3 3 8 7 10 15
# 40
# 输出 9
N = int(input())
records = list(map(int, input().split()))
total = int(input())
def getResult(N, total , records):
sumR = sum(records)
#如果日志总数小于total 则不需要限流
if sumR < total:
return -1
#最大限流数 如果大于records中单次的最大值 则素sumR > total,成为不需要限流的情况
max_limit = max(records)
#最小限流数 如果小于total的均值,则一定满足内存够用和限流条件 并可以将每组都调整到一致
min_limit = total // N
ans = min_limit
while max_limit - min_limit > 1:
limit = (max_limit + min_limit) //2
temp = 0
for record in records:
temp += min(record , limit)
if temp > total:
max_limit = limit
elif temp < total:
min_limit = limit
ans = min_limit
else:
return ans
return ans
print(getResult(N, total, records))运行结果:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。