返回
最小成本购买糖果并使用折扣(Python)
后端
2023-10-24 22:21:28
题目概述
在 LeetCode 的第 70 场双周赛中,题为“2144. 最小成本购买糖果并使用折扣”的题目被归类为简单难度。该题目考察了贪心和数组排序的知识点。
题目
糖果店老板有一个袋子,里面装着一些糖果。袋子里有n种不同口味的糖果,第i种口味的糖果数量为candies[i]。每个糖果的成本为1美元。
为了鼓励顾客购买更多的糖果,糖果店老板决定提供一个折扣。对于购买的每一袋糖果,如果糖果的数量大于等于k,那么每一袋糖果的价格将为其原始价格的d折。
现在,你想要购买糖果并尽可能地节省开销。你可以在同一个袋子里购买多种不同口味的糖果,也可以在不同的袋子里购买相同口味的糖果。
给你一个整数数组candies,其中candies[i]是第i种口味的糖果数量,以及两个整数k和d,分别表示折扣的条件和折扣的价格比例。返回购买所有糖果的最小总成本。
示例 1:
输入:candies = [1, 2, 3], k = 3, d = 50
输出:5
解释:最优方案如下:
购买1个袋子,里面有1种口味的糖果,成本为1美元。
购买1个袋子,里面有2种口味的糖果,成本为2美元。
购买1个袋子,里面有3种口味的糖果,成本为3美元。
购买1个袋子,里面有1种口味的糖果,成本为1美元。
总成本为1 + 2 + 3 + 1 = 7美元。
示例 2:
输入:candies = [7, 2, 5, 10, 8], k = 3, d = 90
输出:26
解释:最优方案如下:
购买1个袋子,里面有7种口味的糖果,成本为7美元。
购买1个袋子,里面有5种口味的糖果,成本为4美元。
购买1个袋子,里面有2种口味的糖果,成本为2美元。
购买1个袋子,里面有3种口味的糖果,成本为3美元。
总成本为7 + 4 + 2 + 3 = 16美元。
示例 3:
输入:candies = [5, 5, 5, 5], k = 2, d = 30
输出:15
解释:最优方案如下:
购买2个袋子,里面有5种口味的糖果,成本为10美元。
总成本为10 + 5 = 15美元。
解题思路
为了解决此问题,我们可以采用以下思路:
- 首先,我们将数组candies根据元素从大到小排序。
- 然后,我们从数组的第一个元素开始遍历,并将当前元素与k进行比较。如果当前元素大于等于k,则意味着我们可以使用折扣来购买这些糖果。
- 如果当前元素小于k,则意味着我们无法使用折扣来购买这些糖果,我们需要将当前元素单独购买。
- 在购买糖果时,我们需要计算购买每种口味的糖果的总成本。对于可以使用折扣的糖果,我们需要计算购买这些糖果的总成本,并将其乘以折扣比例d。
- 最后,我们将每种口味的糖果的总成本加起来,得到购买所有糖果的最小总成本。
Python代码实现
def minCostCandies(candies, k, d):
"""
:type candies: List[int]
:type k: int
:type d: int
:rtype: int
"""
# 将数组candies根据元素从大到小排序
candies.sort(reverse=True)
# 初始化总成本
total_cost = 0
# 遍历数组candies
for i in range(len(candies)):
# 如果当前元素大于等于k,则意味着我们可以使用折扣来购买这些糖果
if candies[i] >= k:
# 计算购买这些糖果的总成本
cost = candies[i] * (1 - d / 100)
# 将总成本加上当前元素的成本
total_cost += cost
# 如果当前元素小于k,则意味着我们无法使用折扣来购买这些糖果,我们需要将当前元素单独购买
else:
# 将总成本加上当前元素的成本
total_cost += candies[i]
# 返回总成本
return total_cost
# 测试用例
candies = [1, 2, 3]
k = 3
d = 50
print(minCostCandies(candies, k, d)) # 输出:5
candies = [7, 2, 5, 10, 8]
k = 3
d = 90
print(minCostCandies(candies, k, d)) # 输出:26
candies = [5, 5, 5, 5]
k = 2
d = 30
print(minCostCandies(candies, k, d)) # 输出:15
运行结果
5
26
15
总结
本文介绍了如何使用Python解决LeetCode的最小成本购买糖果并使用折扣的问题。本文使用了贪心和数组排序的方法,并提供了详细的解决方案和示例代码。此代码易于理解和实现,并提供了必要的注释,使之更易于理解。