📜  TCS Codevita面试体验2020(数字优惠)(1)

📅  最后修改于: 2023-12-03 15:05:30.903000             🧑  作者: Mango

TCS Codevita 面试体验 2020(数字优惠)

介绍

TCS Codevita是由印度IT巨头TCS举办的国际级编程竞赛。2020年度的TCS Codevita比赛将主题定为“数字优惠”,要求选手使用自己的计算机技术与算法知识,在规定的时间内,通过算法设计,对给定的问题进行求解。

面试流程

1.首先,面试官会向你介绍题目,并向你展示算法的输入输出样例。

2.你将有45分钟的时间,自主完成算法设计。

3.完成算法设计之后,需要向面试官进行演示,并说明自己的算法实现思路。

题目

题目整体描述:

您需要使用一个特殊的公司优惠券,使最终订单金额最小。公司优惠券只能使用一次,需要在结账时使用。您需要编写一个算法,找到能够使用公司优惠券的购物车序列的最小支付费用。

输入格式:

  • 行1-购物车中购物商品的数量,(N<=1000)
  • 行2-购物车中的商品列表,按购物顺序输入,按1到N编号。每项包括一个物品名称和价格,之间用空格分隔,1到100、价格1到1000。
  • 行3-优惠券金额C,(C<=1000)

输出格式:

最后一行是购物车中每个商品被支付的实际交易价格,保留两位小数。

样例输入:

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$为购物车中商品数量。