字节跳动 Magic

【题目描述】 给一个包含 n个整数元素的集合 个整数元素的集合 a,一个包含 m个整数元素的集合 b。
定义 magic操作为,从一个集合中取出元素放到另里且过后每的平均值都大于操作前。
注意以下两点:
①不可以把一个集合的元素取空,这样就没有平均值了
②值为 x的元素从集合 b取出放入集合a,但集合 a中已经有值为 x的元素,则 a的平均值不变(因为集 合元素不会重复), b的平均值可能会改变(因为 x被取出了)
问最多可以进行少次 magic操作
输入:
3 5
1 2 5
2 3 4 5 6
输出:
2

 

题目整体不难,记录一下几个细节点:

1.题目涉及转移元素,因为转移后被转的平均数要变大,而转入相同的数不会替换原来的元素,也不会改变原本的平均值,所以这里存放数据的时候都用的是集合,即set. set里的元素就像字典的key值,不存在重复。集合用set()构建。因为涉及后续比较,格式要转为float。

2.用到了一个python中的无穷大作为比较。写法:float('inf')。

自己的代码如下:

class Magic:
    def findMin(self, biggerset, smallerset, meana, meanb):
        min_val = float('inf')
        if not biggerset:
            return -1

        for element in biggerset:
            if min_val > element and element < meana and element > meanb and element not in smallerset:
                min_val = element

        if min_val == float('inf'):
            return -1
        return min_val

    def swap(self, a, b):
        return [b, a]

    def mean(self, seta):
        return sum(seta)/len(seta)

if __name__ == '__main__':
    [n, m] = list(map(int, input().split(' ')))
    seta = set(map(float, input().split(' ')))  # 用set确定其不能重复
    setb = set(map(float, input().split(' ')))

    m = Magic()
    meana = m.mean(seta)
    meanb = m.mean(setb)
    if meana < meanb:  # 确保是seta的平均比setb大
        temp = set()
        temp = seta
        seta = setb
        setb = temp
        [meana, meanb] = m.swap(meana, meanb)

    step = 0
    min_val = m.findMin(seta, setb, meana, meanb)
    while(min_val != -1):
        seta.remove(min_val)
        meana = m.mean(seta)
        setb.add(min_val)
        meanb = m.mean(setb)
        step += 1
        min_val = m.findMin(seta, setb, meana, meanb)

    print(step)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值