公平划分
小爱和小溪有N个数字,他们两个想公平的分配这些数字。小爱拿的数字集合为I=「i1, i2, ik」,小溪获得剩下的J,J=「j1, j2, jn-k」。但是他们衡量分配公平与否的原则与众不同:
在小爱拿到其中的K个数字的前提下,计算出他们分配偏差f(I)的最小值。
输入描述
输入第一行两个数字,分别表示总的数字量N和小爱拿的数字量K。第二行有N个数字,表示每个数字的值。
输出描述
输出一个数字,表示分配偏差f(I)的最小值。
示例1
输入
4 1
3 3 3 1
输出
2
本题可以直接暴力求解,首先穷举出所有情况,从n个数中取出k个数,此处直接调用了python的itertools中的combinations
函数,返回的是一个tuple,然后遍历每一个组合,求出take(n个)和rest(n-k个),然后依次对两个数组求差,得到分配偏差,求出最小的偏差即可.
牛客网的测试用例有些不太规范,n和k有时候是一行输出,有时候是两行输出,所以加一个判断即可.
from itertools import combinations
dims = list(map(int, input().split()))
if len(dims) == 2:
n = dims[0]
k = dims[1]
else:
n = dims[0]
k = int(input())
nums = list(map(int, input().split()))
mini_res = float('inf')
takes = combinations(nums, k) # 获取所有的组合情况
def get_rest(nums, take): # 获取另外n-k个
for t in take:
if t in nums:
nums.remove(t)
return nums
for take in takes: # 遍历所有组合
take = list(take)
rest = get_rest(nums[:], take)
bias = 0 # 偏差
for t in take:
for r in rest:
bias += abs(t-r)
mini_res = min(bias, mini_res) # 更新最小偏差和
print(mini_res)