题目描述
某网上商场举办优惠活动,发布了满减、打折、无门槛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] ,都为整数)。
- 约定:输入都是符合题目设定的要求的。
输出描述
- 每行输出每个人每次购物优惠后的最低价格以及使用的优惠券总数量
- 每行的输出顺序和输入的顺序保持一致
备注
- 优惠券数量都为整数,取值范围为[0, 10]
- 购物人数为整数,取值范围为[1, 10000]
- 优惠券的购物总价为整数,取值范围为 (0, 1000]
- 优惠后价格如果是小数,则向下取整,输出都为整数。
用例
输入
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)