笔试题

93 阅读2分钟
题目

四达时代在非洲部分国家开展广播电视运营服务,针对非洲人民的消费习惯,对同一个节目包都会提供不同规格的购买套餐。

假定全部节目包的不同规格套餐的每日资费相同,均为每日1元。当某个用户来四达营业厅购买节目包套餐时,每购买一个套餐需要打印一张发票,因此当用户购买多个套餐时,为了节约打印发票时间,需要计算最少的套餐个数。

例如一个节目包,有1日,2日和5日三种规格,则该节目的套餐价格列表为 1,2,5。用户缴纳了11元现金,最少需要购买2个5日包和1个1日包,一共需要打印3张发票。

例如一个节目包,只有1日规格,则该节目的套餐价格列表为 1。用户缴纳了10元现金,最少需要购买10个1日包,一共需要打印10张发票。

例如有一个节目包,有1日,9日和10日三种规格,则该节目包的套餐价格列表为1,9,10。用户缴纳了18元现金,最少需要购买2个9日包,一共需要打印2张发票。

输入顺序为:package amount,package为不同规格的套餐资费,默认输入至少提供1日资费1元,package使用英文逗号分隔。amount为用户准备购买节目套餐的现金。

输出:打印发票的张数

例如:

input1:1,2,5 11 output1: 3

input2:1,9,10 18 output2: 2

input3:1,2,5,10 26 output3:4

Python:

def get_min_packages(package, amount):
    # 将不同规格的套餐资费转换为整数列表
    package_list = [int(x) for x in package.split(",")]
    # 从大到小排序
    package_list.sort(reverse=True)
    # 计算最少需要购买的套餐数量
    count = 0
    for p in package_list:
        if amount >= p:
            count += amount // p
            amount %= p
    return count

# 测试
print(get_min_packages("1,2,5", 11))  # 输出 3
print(get_min_packages("1,9,10", 18))  # 输出 2
print(get_min_packages("1,2,5,10", 26))  # 输出 4

将输入的不同规格的套餐资费转换为整数列表后,按照从大到小的顺序排序,然后依次计算最少需要购买的套餐数量。

使用整除运算符//可以得到除法的整数部分,使用取模运算符%可以得到除法的余数部分。最后返回最少需要购买的套餐数量即可。