游游有n种魔法球,第i种魔法球的魔力值为 a i a_i ai,数量为 b i b_i bi个。 每次操作可以合并两个魔力值相同的魔法球(设它们的魔力值为k),合并后原来的两个魔法球消失,并生成一个魔力值为k+2的新魔法球。游游将合并到无法操作为止。 请你帮游游求出最终魔法球数量、以及每个魔法球的魔力值。
输入描述
第一行输入一个正整数n,代表魔法球的种类。接下来的n行, 每行输入两个正整数a_i, b_i,代表每个魔法球的魔力值以及数量。
输出描述
第一行输出一个正整数m,代表最终魔法球的数量。 第二行输出m个正整数,代表最终每个魔法球的魔力值。请按从小到大的顺序输出。
示例
输入
3
1 2
2 1
3 4
输出
4
3 3 5 5
解题思路一:
用一个字典记录每种魔力值的魔法球数量。
使用最小堆来处理魔法球合并,使得每次都处理最小的魔法球。
每次从堆中取出最小的魔法球进行合并,更新数量并将新的魔法球重新放回堆中。
合并完成后,整理最终剩余的魔法球数量和魔力值。
import heapq
def solve(n, balls):
dic = {}
for a, b in balls:
if a in dic:
dic[a] += b
else:
dic[a] = b
min_heap = []
for a in dic:
heapq.heappush(min_heap, a)
while min_heap:
current = heapq.heappop(min_heap)
count = dic[current]
pairs = count // 2
if pairs > 0:
b = current + 2
c = pairs
if b in dic:
dic[b] += c
else:
dic[b] = c
heapq.heappush(min_heap, b)
dic[current] = count % 2
result = []
for a in sorted(dic):
if dic[a] > 0:
result.extend([a] * dic[a])
return len(result), result
n = int(input().strip())
balls = []
for _ in range(n):
a, b = map(int, input().strip().split())
balls.append((a, b))
m, final_balls = solve(n, balls)
print(m)
print(" ".join(map(str, final_balls)))
时间复杂度:O(n)
空间复杂度:O(n)
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠