问题描述
小C来到了一家餐馆,准备点一些菜。
已知该餐馆有 n 道菜,第 i 道菜的售价为 w(w随着 i 的变化而变化)。
小C准备点一些价格相同的菜,但小C不会点单价超过 m 的菜。
小C想知道,自己最多可以点多少道菜?
整体思路分析
- 首先判断菜的售价,将符合条件的菜单放入一个数组当中
- 之后再统计其中相同价格菜品最多的价格
- 该售价则为小c能点的最多的菜
注意事项
-
要看清题目,要统计的是相同价格并且单价小于m的菜品,而不是单价小于m的菜品。
-
在得出相同的单价的菜品数量时,记录每次菜品的数量num在每次的循环结束后要记得初始化,否则第二种单价的数量为第一种单价的数量加上第一种单价数量,导致出错。倘若num想从1开累加,则在for循环中则i不能等于j即可。
具体代码
- 首先判断菜的单价,利用for循环来将符合条件的菜放入一个vector数组当中
vector<int> a;
for(char A:w)
{
if(A<=m)
{
a.push_back(A);
}
}
- 再来利用两个for循环统计其中相同价格最多的菜品的单价,其中需先判断各种单价菜品的数量,再来将这些数量进行对比,从而得出最多的相同价格的菜品数量。每次num的即为相同单价的菜品数量,再将num与max进行判断即可得出num的最大值
int max=0;
for(int i=0;i<a.size();i++)
{
int num = 0;
for(int j=0;j<a.size();j++)
{
if(a[i]==a[j])
{
num++;
}
}
max=max<num?num:max;
}
- 该菜品数量则为小c能点的最多的菜品数量,返回其的值即可
return max;
感悟
这个问题需要对于问题逻辑有着清晰的认识,主要体现在如何高效地统计相等元素的个数,处理连续相等的元素以及边界问题的处理。在统计相同单价菜品数量时,我使用了两个for循环,时间复杂程度较高,可以去寻找一些更加简单的方法来求解。同时,数组为空与数组为1的情况需要特殊处理,返回0。通过这个题目,使我的思维能力得到了锻炼,对于初始化数据的不同情况有了进一步的了解。