2024-12-11 17:31:43 +08:00

62 lines
1.8 KiB
Python

# TODO: 未完成
def solve(n, m, balls):
# 将球按正负数和零分类并排序
pos = sorted([x for x in balls if x > 0], reverse=True) # 正数降序
neg = sorted([x for x in balls if x < 0]) # 负数升序
zeros = [x for x in balls if x == 0]
# 如果正数不够分配给每个篮筐,需要特殊处理
if len(pos) < m:
# 需要用负数或零来确保每个篮筐都有球
return None # 这里需要根据具体情况处理
# 初始化篮筐
baskets = [1] * m
# 优先处理负数对
neg_pairs = []
for i in range(0, len(neg) - 1, 2):
neg_pairs.append(neg[i] * neg[i + 1])
# 如果有单独的负数,与最小的正数配对或单独放在一个篮筐
if len(neg) % 2 == 1:
last_neg = neg[-1]
if pos and last_neg * pos[-1] > last_neg:
neg_pairs.append(last_neg * pos.pop())
else:
# 把单独的负数放在一个新的篮筐
smallest_basket_idx = 0
baskets[smallest_basket_idx] *= last_neg
# 将负数对的结果按从大到小排序
neg_pairs.sort(reverse=True)
# 分配负数对结果
for i, pair_product in enumerate(neg_pairs):
baskets[i % m] *= pair_product
# 分配零
zero_idx = 0
while zeros and zero_idx < m:
if baskets[zero_idx] == 1: # 只在篮筐未使用时放零
baskets[zero_idx] *= zeros.pop()
zero_idx += 1
# 分配剩余的正数
pos_idx = 0
for num in pos:
baskets[pos_idx % m] *= num
pos_idx += 1
return sum(baskets)
# 读取输入并处理
while True:
n, m = map(int, input().split())
if n == 0 and m == 0:
break
balls = list(map(int, input().split()))
result = solve(n, m, balls)
print(result)