2024年5月20日携程暑期实习试题-题目+题解,2024.5.20,携程机试-????题目三描述:

游游有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)


创作不易,观众老爷们请留步… 动起可爱的小手,点个赞再走呗 (๑◕ܫ←๑)
欢迎大家关注笔者,你的关注是我持续更博的最大动力


原创文章,转载告知,盗版必究



在这里插入图片描述


在这里插入图片描述
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠

上一篇:docker-file 网络-docker compose


下一篇:深度神经网络