📅  最后修改于: 2023-12-03 15:05:30.903000             🧑  作者: Mango
TCS Codevita是由印度IT巨头TCS举办的国际级编程竞赛。2020年度的TCS Codevita比赛将主题定为“数字优惠”,要求选手使用自己的计算机技术与算法知识,在规定的时间内,通过算法设计,对给定的问题进行求解。
1.首先,面试官会向你介绍题目,并向你展示算法的输入输出样例。
2.你将有45分钟的时间,自主完成算法设计。
3.完成算法设计之后,需要向面试官进行演示,并说明自己的算法实现思路。
题目整体描述:
您需要使用一个特殊的公司优惠券,使最终订单金额最小。公司优惠券只能使用一次,需要在结账时使用。您需要编写一个算法,找到能够使用公司优惠券的购物车序列的最小支付费用。
输入格式:
输出格式:
最后一行是购物车中每个商品被支付的实际交易价格,保留两位小数。
样例输入:
6
item1 100
item2 200
item3 300
item4 400
item5 500
item6 600
1000
样例输出:
item1 76.67
item2 186.67
item3 296.67
item4 406.67
item5 500.00
item6 600.00
该算法的实现思路如下:
1.将购物车中的商品按价格从低到高排序,即价格小的商品排在前面。
2.从排列后的商品列表中找到能够使用公司优惠券的商品(该商品的价格等于或超过优惠券金额),并记录该商品下标。
3.若没有找到符合条件的商品,则将优惠券金额全部用于最贵的商品。
4.从0到能够使用公司优惠券的商品下标之前的商品,用优惠券的金额平分所有商品价格。
5.对于在使用优惠券前已经比优惠券金额低的商品,不参与分配优惠券。
6.对于优惠券无法覆盖到的最贵商品,用原价支付。
7.输出每个商品实际交易价格。
以下是使用Python3.7实现该算法的代码片段:
# 解析输入数据
n = int(input())
prods = []
for i in range(n):
name, price = input().strip().split()
prods.append((name, int(price)))
coupon = int(input())
# 将购物车列表按价格排序
prods.sort(key=lambda x: x[1])
# 寻找能够使用优惠券的商品
idx = -1
for i in range(n):
if prods[i][1] >= coupon:
idx = i
break
# 如果没有找到符合条件的商品,则优惠券用在最贵的商品上
if idx == -1:
idx = n - 1
prods[idx] = (prods[idx][0], prods[idx][1]-coupon)
# 平分优惠券前的商品价格
per_price = coupon / (idx+1)
for i in range(idx+1):
prods[i] = (prods[i][0], prods[i][1]-per_price)
# 输出结果
for prod in prods:
print(f"{prod[0]} {prod[1]:.2f}")
该算法的时间复杂度为$O(n\log n)$,其中$n$为购物车中商品数量。