首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >二分查找-日志限流

二分查找-日志限流

原创
作者头像
Swing Dunn
发布于 2025-11-10 14:14:20
发布于 2025-11-10 14:14:20
2230
举报
文章被收录于专栏:刷点题15天(一)刷点题15天(一)

二分查找:是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将目标值与数组中间的元素进行比较,如果目标值小于中间元素,则在数组的左半部分继续查找,否则在右半部分查找,不断缩小搜索范围,直到找到目标值或确定目标值不存在为止。二分查找的时间复杂度为O(logn),即查找效率较高。

代码语言:txt
复制
# 某软件系统会在运行过程中持续产生日志,系统每天运行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 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档