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

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

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)continuea.sort()asum = sum(a)# aver = asum / n# index = bisect.bisect_left(a, aver/2)# if index > n // 2:#     print(0)#     continue# 接下来怎么办?# 增加数的问题,具有二分的性质# 考虑增加的数量为middef check(mid):a[-1] += midtmpsum = asum + midaver = tmpsum / nindex1 = bisect.bisect_left(a, aver/2)a[-1] -= midreturn index1 > n // 2l,r = 0,10**12res = float('inf')while l<=r:mid = (l+r)//2if check(mid):res = min(res,mid)r = mid - 1else:l = mid + 1print(res)

http://www.mrgr.cn/news/98197.html

相关文章:

  • 【前端】webpack一本通
  • 【Linux】单例模式及其在线程池中的应用
  • C++ STL及Python中等效实现
  • Linux 内核知识体系
  • 【SQL Server 2017】封闭网络下,数据调研所有数据表实战(提效400%)
  • 【langchain库名解析】
  • vue周边库安装与开发者工具(vue系列二)
  • 学习MySQL的第八天
  • Unity 动画
  • Compose笔记(十六)--ExoPlayer
  • 数据结构day05
  • Git版本管理系列:(三)远程仓库
  • OpenHarmony5.0.2 音频audio适配
  • 网络机顶盒怎么连接WiFi-机顶盒连接wifi攻略,乐看家桌面轻松畅享网络视听
  • C++初阶-inline的使用
  • 09-设计模式企业场景 面试题-mk
  • PHM学习软件|PHM预测性维护系统
  • 『Kubernetes(K8S) 入门进阶实战』实战入门 - Pod 详解
  • 深入理解 RxSwift 中的 Driver:用法与实践
  • Ubuntu 22.04 AI大模型环境配置及常用工具安装