2023年华为OD机试(python)B卷-购物

一、题目

题目描述:
商店里有N件唯一性商品,每件商品有一个价格,第i件商品的价格是a[i]。一个购买方案可以是从N件商品种选择任意件进行购买(至少一件) ,花费即价格之和。 现在你需要求出所有购买方案中花费前K小的方案,输出这些方案的花费。当两个方案选择的商品集合至少有一件不同,视为不同方案,因此可能存在两个方案花费相同。

二、输入输出

输入描述:
输入数据含两行: 第一行包含两个整数N,K,整数之间通过空格隔开。分别表示商品的个数,以及需要求得的花费个数。1<=N<=10000,1<=K<=min(2^N - 1, 100000)
第二行包含N个整数a1,a2,..an,整数之间通过空格隔开。表示N件商品的价格。1<=a1<= a2  ...<= an <= 10000
输出描述:
按花费从小到大的顺序依次输出K行,一行一个整数。表示花费前K小的购买方案的花费

三、示例

示例1:
输入:
5 6
1 1 2 3 3 
输出:
1
1
2
2
3
3
示例2:
输入
3 5
1 100 101 
输出:

100
101
101
102

四、解题思路

使用动态规划的方法

五、参考代码 

# -*- coding: utf-8 -*-
'''
@File    :   2023-B-购物.py
@Time    :   2023/12/28 03:37:54
@Author  :   mgc 
@Version :   1.0
@Desc    :   None
'''

# import os
# import re
# import sys
# import copy
# import math
# import queue
# import functools
# from queue import Queue
# from collections import Counter, defaultdict

from queue import PriorityQueue

def findTopKCosts(n, m, nums):
    nums = sorted(nums, key=lambda x: x, reverse=False)  # 对商品价格列表进行排序

    self_queue = PriorityQueue()
    c = [nums[0], [0, 0]]  # 初始化c

    for i in range(m):
        print(c[1][0] + nums[c[1][1]])  # 输出当前购买方案的花费

        if c[1][1] + 1 < n:
            # 将下一个购买方案加入优先队列
            self_queue.put([c[1][0] + nums[c[1][1]] + nums[c[1][1] + 1], [c[1][0] + nums[c[1][1]], c[1][1] + 1]])
            c[1][1] += 1
            self_queue.put([c[1][0] + nums[c[1][1]], c[1]])

        c = self_queue.get()  # 获取下一个花费最小的购买方案

# 调用主函数
if __name__ == '__main__':
    params = [int(x) for x in input().split()]  # 输入参数
    n = params[0]  # 商品个数
    m = params[1]  # 花费个数
    nums = [int(x) for x in input().split()]  # 商品价格列表

    findTopKCosts(n, m, nums)

你可能感兴趣的:(华为机试,华为od,python,链表,华为机试,购物)