C. Robin Hood in Town思考与理解

文章目录

C. Robin Hood in Town


  • 首先就是得思考一个问题:如何快速找到有多少个数严格小于平均数的一半?答案是显而易见的,二分,所以我们需要进行升序排序
  • 考虑题目给出的特殊情况当n=1或n=2的时候,直接输出-1即可
  • 那么对于可以通过增加x来判断满足最小的x的问题,这里就转换为,如何快速增加x,然后逐一判断这个x所带来的影响?
    • 直接暴力的做法肯定是x从0开始,逐个+1显而易见,这样十分慢
    • 正确的做法是直接使用二分,这里就要考虑这个二分的范围了,最小肯定是0,那么最大是多少?假设n全部放在一个测试用例,那么考虑到最大的数是10**6,n的最大范围2*10**5,如果开始的全部的n都是1,那么我们得将一半的数全部变为最大也就是10**11
python 复制代码
import bisect
# 二分+二分的问题
t = int(input())
for _ in range(t):
    n = int(input())
    a = list(map(int, input().split()))
    if n == 1 or n == 2:
        print(-1)
        continue
    a.sort()
    asum = sum(a)
    # aver = asum / n
    # index = bisect.bisect_left(a, aver/2)
    # if index > n // 2:
    #     print(0)
    #     continue
    # 接下来怎么办?
    # 增加数的问题,具有二分的性质
    # 考虑增加的数量为mid
    def check(mid):
        a[-1] += mid
        tmpsum = asum + mid
        aver = tmpsum / n
        index1 = bisect.bisect_left(a, aver/2)
        a[-1] -= mid
        return index1 > n // 2
    l,r = 0,10**12
    res = float('inf')
    while l<=r:
        mid = (l+r)//2
        if check(mid):
            res = min(res,mid)
            r = mid - 1
        else:
            l = mid + 1
    print(res)
相关推荐
北域码匠1 天前
高通滤波算法深度解析(High-Pass Filter)
stm32·算法·c#·数字信号处理·嵌入式开发·滤波算法·高通滤波
指掀涛澜天下惊1 天前
强化学习进阶篇八 策略梯度算法
深度学习·学习·算法·强化学习
乌萨奇也要立志学C++1 天前
【洛谷】kmp算法
开发语言·算法
禹凕1 天前
Dijkstra算法详解与应用
python·算法
YaraMemo1 天前
元启发式算法框架
人工智能·算法·5g·信息与通信·启发式算法·信号处理
weixin_307779131 天前
一维无粘 Burgers 方程的激波形成问题:MacCormack 格式求解
c++·算法·matlab
HugoStudio_SWAN1 天前
洛谷 B4500 / B4449 / B3843 凯撒密码、密码强度与密码合规——加密与安全的三道门
c++·学习·程序人生·算法·安全
枫叶林FYL1 天前
【群体智能集群控制工程实践】第3章 一致性协同算法
算法
禹凕1 天前
滑动窗口算法实战指南
python·算法
DisonTangor1 天前
【腾讯混元雪耻归来】 Hy4 preview:770B 参数 MoE 旗舰模型,1M 上下文全面开源
人工智能·算法·开源·aigc·腾讯云·腾讯云ai代码助手