今天分析的问题是小C来到了一家餐馆,准备点一些菜。已知该餐馆有 n 道菜,第 i 道菜的售价为 wi。小C准备点一些价格相同的菜,但小C不会点单价超过 m 的菜。小C想知道,自己最多可以点多少道菜?
题目分析
本题描述了小 C 在一家餐馆点菜的情景,已知餐馆有 n 道菜,每道菜有其对应的售价 w_i,并且小 C 有一个点菜限制,即不会点单价超过 m 的菜,同时小 C 只想点价格相同的菜。问题的关键在于在满足价格限制的条件下,找出价格相同的菜中数量最多的那一组,确定小 C 最多可以点多少道菜。
思路分析
为了解决这个问题,我们可以采取以下步骤:
首先,遍历所有菜品的价格,筛选出价格不超过 m 的菜品。
然后,对于筛选出的菜品,使用一个字典来统计每种价格的菜品出现的次数。
最后,在统计结果中找出出现次数最多的价格对应的菜品数量,即为小 C 最多可以点的菜的数量。
代码实现
def max_dishes(n, m, w):
valid_dishes = [price for price in w if price <= m] # 筛选出价格不超过m的菜品
price_count = {}
for price in valid_dishes:
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
代码分析
筛选符合价格要求的菜品:
在函数 max_dishes 中,首先使用列表推导式 [price for price in w if price <= m] 遍历输入的菜品价格列表 w,将价格不超过 m 的菜品价格筛选出来,存储在列表 valid_dishes 中。
统计每种价格的菜品数量:
接着,创建一个空字典 price_count,用于统计每种价格的菜品出现的次数。通过遍历 valid_dishes 列表,对于每个价格 price,如果它已经在字典 price_count 中,就将其对应的计数加 1;如果不在字典中,就将其作为新的键添加到字典中,并将计数初始化为 1。
找出最多可点的菜的数量:
然后,初始化一个变量 max_count 为 0,用于记录出现次数最多的菜品数量。通过遍历字典 price_count 的值(即每种价格的菜品数量),如果某个数量 count 大于当前的 max_count,就更新 max_count 为这个更大的数量。
返回结果:
最后,函数返回 max_count,它就是小 C 最多可以点的菜的数量
测用示例
正常情况测试:
假设 n = 5,m = 10,菜品价格列表 w = [5, 8, 3, 5, 12]。
首先筛选出价格不超过 10 的菜品,得到 [5, 8, 3, 5]。
然后统计每种价格的菜品数量,得到 {5: 2, 8: 1, 3: 1}。
出现次数最多的是价格为 5 的菜品,数量为 2,所以函数应返回 2。
边界情况测试:
当 n = 3,m = 5,菜品价格列表 w = [2, 5, 5]。
筛选后得到 [2, 5, 5]。
统计数量得到 {2: 1, 5: 2}。
函数应返回 2,即价格为 5 的菜品数量。
再考虑一种边界情况,当 n = 4,m = 1,菜品价格列表 w = [2, 3, 4, 5]。
筛选后得到 [],因为没有价格不超过 1 的菜品。
此时统计数量的字典为空,函数最终应返回 0,表示小 C 无法点任何菜。
知识总结
列表推导式:掌握了如何使用列表推导式快速筛选出满足特定条件的元素,如在代码中筛选出价格不超过 m 的菜品价格,它是一种简洁高效的方式来生成新的列表。
字典的使用:深入理解了字典在统计数据出现次数方面的应用。通过将元素作为键,出现次数作为值,可以方便地对数据进行分类统计,如统计每种价格的菜品数量。
学习心得 分析问题的重要性:在解决这个问题之前,需要仔细分析题目给出的条件和要求,明确问题的核心是找出满足价格限制且数量最多的同价格菜品。只有准确理解了问题,才能设计出合理的解决思路。
数据结构的选择:合适的数据结构对于解决问题至关重要。在本题中,选择使用列表来存储菜品价格,使用字典来统计每种价格的菜品数量,这样的组合使得数据处理和分析更加方便快捷。这让我认识到在今后的编程中,要根据问题的特点灵活选择合适的数据结构。