文章目录


- 首先就是得思考一个问题:如何快速找到有多少个数严格小于平均数的一半?
答案是显而易见的,二分,所以我们需要进行升序排序
- 考虑题目给出的特殊情况
当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)