【题目描述】 给一个包含 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)