最小化战斗力差距
问题描述
小蓝是机甲战队的队长,他手下共有n名队员,每名队员都有一个战斗力值 wi。现在他需要将这n名队友分成两组a和6,分组必须满足以下条件
。每个队友都属于a组或6组
。a组和6组都不为空
。战斗力差距最小。
战斗力差距的计算公式为max(a)min(6),其中max(a)表示a组中战斗力最大的,min(6)表示6组中战斗力最小的。
请你计算出可以得到的最小战斗力差距
import os
import sys
n=int(input())
w=list(map(int,input().split()))
a=float('inf') #zheng
w.sort()
for i in range(1,n):
a=min(a,w[i]-w[i-1])
print(a)
解题思路
我们假设 \max(a)max(a) 为 xx,\min(b)min(b) 为 yy。求解 |x-y|∣x−y∣ 的最小值,本质上就是要使得 xx 和 yy 的相对距离最小。对于数组来说,将其排序后,相邻元素之间的相对距离一定是最小的,即答案为数组排序后所有相邻元素差值的最小值。
我们需要考虑这样排序后的构造是否是合法的,实际上可以构造一种满足条件的分组方法:假设对于排序后随意一组相邻的两个元素,左边的元素设为 ll,右边的元素为 rr,因为数组有序,所以 ll 左边的元素均不大于 ll,于是我们可以将 ll 左边的元素和 ll 视为 aa 组;同时 rr 右边的元素