【华为OD机试 2023】 模拟商场优惠打折(Python)

文章描述了一个针对网上商场优惠活动的问题,需要设计算法帮助用户以最少的优惠券获取最优的价格。给出的Python代码实现考虑了满减、打折和无门槛优惠券的组合使用,以达到最低的购物成本。对于每个购物者,程序会根据其购物金额和优惠券数量找到最佳的优惠券使用策略。
摘要由CSDN通过智能技术生成

题目描述

某网上商场举办优惠活动,发布了满减、打折、无门槛3种优惠券,分别为:

  • 每满100元优惠10元,无使用数限制,如100~199元可以使用1张减10元,200~299可使用2张减20元,以此类推;
  • 92折券,1次限使用1张,如100元,则优惠后为92元;
  • 无门槛5元优惠券,无使用数限制,直接减5元。

优惠券使用限制:

  • 每次最多使用2种优惠券,2种优惠可以叠加(优惠叠加时以优惠后的价格计算),以购物200元为例,可以先用92折券优惠到184元,再用1张满减券优惠10元,最终价格是174元,也可以用满减券2张优惠20元为180元,再使用92折券优惠到165(165.6向下取整),不同使用顺序的优惠价格不同,以最优惠价格为准。
  • 在一次购物种,同一类型优惠券使用多张时必须一次性使用,不能分多次拆开使用(不允许先使用1张满减券,再用打折券,再使用一张满减券)。

问题:

  • 请设计实现一种解决方法,帮助购物者以最少的优惠券获得最优的优惠价格。优惠后价格越低越好,同等优惠价格,使用的优惠券越少越好,可以允许某次购物不使用优惠券。

约定:

  • 优惠活动每人只能参加一次,每个人的优惠券种类和数量是一样的。

输入描述

  • 第一行:每个人拥有的优惠券数量(数量取值范围为[0,10]),按满减、打折、无门槛的顺序输入
  • 第二行:表示购物的人数n(1 ≤ n ≤ 10000)
  • 最后n行:每一行表示某个人优惠前的购物总价格(价格取值范围(0, 1000] ,都为整数)。
  • 约定:输入都是符合题目设定的要求的。

输出描述

  • 每行输出每个人每次购物优惠后的最低价格以及使用的优惠券总数量
  • 每行的输出顺序和输入的顺序保持一致

备注

  1. 优惠券数量都为整数,取值范围为[0, 10]
  2. 购物人数为整数,取值范围为[1, 10000]
  3. 优惠券的购物总价为整数,取值范围为 (0, 1000]
  4. 优惠后价格如果是小数,则向下取整,输出都为整数。

用例

输入

3 2 5
3
100
200
400

输出

65 6
155 7
338 4

Python代码

import copy
def use_T1(ticket, res):
    tmp = res[0]
    while tmp >= 100 and ticket > 0:
        res[0] -= 10
        res[1] += 1
        ticket -= 1
        tmp -= 100
    return(res)

def use_T2(ticket, res):
    if ticket > 0:
        res[0] = int(res[0] * 0.92)
        res[1] = 1
    return res

def use_T3(ticket, res):
    while ticket > 0 and res[0] >= 5:
        res[0] -= 5
        ticket -= 1
        res[1] += 1
    return res

t1, t2, t3 = map(int, input().split())
n = int(input())
amounts = [int(input()) for _ in range(n)]
for amount in amounts:
    res1 = use_T1(t1, [amount, 0])
    res2 = use_T2(t2, [amount, 0])
    res3 = use_T3(t3, [amount, 0])
    result = [float('inf'), float('inf')]

    if amount < 100:
        result = use_T3(t3, res2)
        print(*result)
        continue
    else:
        if res1[0] <= res2[0]:
            tmp_res = copy.copy(res1)
            r2 = use_T2(t2, res1)
            r3 = use_T3(t3, tmp_res)
            result = r2 if r2[0] <= r3[0] else r3
        else:
            tmp_res = copy.copy(res2)
            r1 = use_T1(t1, res2)
            r3 = use_T3(t3, tmp_res)
            result = r1 if r1[0] <= r3[0] else r3
        print(*result)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值