返回

最小成本购买糖果并使用折扣(Python)

后端

题目概述

在 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美元。

解题思路

为了解决此问题,我们可以采用以下思路:

  1. 首先,我们将数组candies根据元素从大到小排序。
  2. 然后,我们从数组的第一个元素开始遍历,并将当前元素与k进行比较。如果当前元素大于等于k,则意味着我们可以使用折扣来购买这些糖果。
  3. 如果当前元素小于k,则意味着我们无法使用折扣来购买这些糖果,我们需要将当前元素单独购买。
  4. 在购买糖果时,我们需要计算购买每种口味的糖果的总成本。对于可以使用折扣的糖果,我们需要计算购买这些糖果的总成本,并将其乘以折扣比例d。
  5. 最后,我们将每种口味的糖果的总成本加起来,得到购买所有糖果的最小总成本。

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的最小成本购买糖果并使用折扣的问题。本文使用了贪心和数组排序的方法,并提供了详细的解决方案和示例代码。此代码易于理解和实现,并提供了必要的注释,使之更易于理解。