数组之公平划分

公平划分

小爱和小溪有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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值