62 lines
1.8 KiB
Python
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)
|