题目
解题
方法一:有序map+有序set
根据烹饪方式,可以获得菜品和对应的得分,里面选择一个得分最大的。
1.首先使用unordered_map<string,XXXX>
根据烹饪方式,获取对应得菜品和得分。
2.那么如何获得 得分 最大呢,可以使用有序map(红黑树),以得分作为key,从大到小排序。
因此有map<int,XXXX,greater<int>>
,于是可以通过得分获得对应的菜品
3.为了保证菜品为字典序,因此使用有序集合,从小到大排序 ,set<string>
于是
unordered_map<string,map<int,set<string>,greater<int>>> map;
就可以根据 烹饪方式---->最大得分---->字典序最小的
class FoodRatings { public: map<string,int> foodRating;//菜品--->得分 map<string,string> foodClass;//菜品-->烹饪方式 unordered_map<string,map<int,set<string>,greater<int>>> map;//烹饪方式---->得分(从大到小)---->菜品 FoodRatings(vector<string>& foods, vector<string>& cuisines, vector<int>& ratings) { for(int i=0;i<foods.size();i++){ foodRating[foods[i]]=ratings[i]; foodClass[foods[i]]=cuisines[i]; map[cuisines[i]][ratings[i]].insert(foods[i]); } } void changeRating(string food, int newRating) { //从集合中删除对应的旧菜品得分 map[foodClass[food]][foodRating[food]].erase(food); if(map[foodClass[food]][foodRating[food]].empty()){//如果对应得分的map为空,那么就删除该map map[foodClass[food]].erase(foodRating[food]); } //记录新菜品得分 foodRating[food]=newRating; map[foodClass[food]][newRating].insert(food); } string highestRated(string cuisine) { return *(map[cuisine].begin()->second.begin()); } };