点菜问题|豆包MarsCode AI刷题

48 阅读3分钟

题目深度解析与详细解答

题目背景
小C踏入了一家餐馆,准备享受一顿美食。餐馆提供了n道各具特色的菜品,每道菜都有其独特的售价。然而,小C在点菜时有两个限制条件:他只愿意选择价格相同的菜品,并且这些菜品的单价不能超过他设定的上限m。在此情境下,小C渴望了解自己最多能品尝到多少道心仪的菜品。

解题思路

  1. 数据预处理

    • 首先,我们需要从输入中捕获餐馆提供的菜品数量n、价格上限m,以及每道菜的具体售价。
    • 考虑到小C的价格限制,我们应筛选出所有售价不超过m的菜品。
  2. 价格频次统计

    • 接下来,我们需要对筛选后的菜品价格进行频次统计。这里,我们可以利用Python的字典(哈希表)来高效地完成这一任务。字典的键代表价格,而对应的值则记录该价格出现的次数。
  3. 寻找最大频次

    • 有了价格频次统计后,我们需要遍历字典,找出出现次数最多的价格。这个最大的频次值,即代表了小C在价格限制下,最多能点的相同价格菜品的数量。
  4. 算法优化

    • 在整个解题过程中,我们始终关注于效率和准确性。筛选菜品和统计价格频次都采用了线性扫描的方法,确保了算法的时间复杂度为O(n),其中n是菜品的总数。
    • 寻找最大频次的操作则是在遍历字典时完成的,由于字典的遍历通常也是线性的,因此这一步骤的时间复杂度也是O(k),其中k是不同价格的数量,且k远小于n。

详细解题步骤

  • 步骤1:读取输入数据,包括菜品数量n、价格上限m,以及每道菜的价格列表prices。
  • 步骤2:使用列表推导式筛选出价格不超过m的菜品,生成新的列表valid_prices。
  • 步骤3:创建一个空字典price_count,用于记录每个价格及其出现的次数。遍历valid_prices,更新price_count。
  • 步骤4:初始化一个变量max_count为0,用于记录最大的价格频次。遍历price_count的值,更新max_count。
  • 步骤5:返回max_count作为结果,即小C最多能点的相同价格菜品的数量。

代码实现

python复制代码
	def max_dishes(n, m, prices):

	    # 筛选出价格不超过m的菜品

	    valid_prices = [p for p in prices if p <= m]

	    

	    # 统计每个价格出现的次数

	    price_count = {}

	    for price in valid_prices:

	        if price in price_count:

	            price_count[price] += 1

	        else:

	            price_count[price] = 1

	    

	    # 找出出现次数最多的价格

	    max_count = 0

	    for count in price_count.values():

	        if count > max_count:

	            max_count = count

	    

	    return max_count

	 

	# 示例输入

	n = 5  # 菜品数量

	m = 5  # 价格上限

	prices = [3, 5, 5, 2, 8]  # 每道菜的价格

	 

	# 调用函数并打印结果

	print(max_dishes(n, m, prices))  # 输出: 2,表示小C最多可以点2道价格为5的菜品

通过上述步骤和代码,我们不仅能清晰地理解小C如何在餐馆中做出最优的点菜选择,还能领略到Python在处理此类问题时的高效与便捷。