远视储备减少,近视风险增加!这样做守护孩子视力发育“储蓄罐”
2025/12/28 23:05:06
输入:
FoodRatings(foods, cuisines, ratings):初始化 n 种食物changeRating(food, newRating):修改某个食物评分highestRated(cuisine):查询某种烹饪方式下评分最高的食物(若并列取字典序更小)要求:
输出:
highestRated返回食物名思路:
这题核心就是维护两个维度的信息:
用unordered_map<string, pair<string,int>> food_info存:
changeRating(food, ...)时,O(1) 找到它属于哪个菜系 + 旧评分是多少。用unordered_map<string, set<pair<int,string>>> cuisine_ratings存:
set,里面放(-rating, food)这样的二元组。set默认按 pair 从小到大排序:-rating越小,代表rating越大(最高分排最前)-rating相同,就比较food字符串(字典序小的排前)highestRated(cuisine)直接返回begin()->second即可。对一个食物:
food_info取出它的cuisine和oldRatingset里删除旧键(-oldRating, food)(-newRating, food)food_info[food].second = newRating这样能保证每次修改后,菜系的“冠军”始终在set.begin()。
复杂度:
changeRating:O(log M)(M 为该 cuisine 下食物数)highestRated:O(1)(取 begin)classFoodRatings{private:unordered_map<string,pair<string,int>>food_info;unordered_map<string,set<pair<int,string>>>cuisine_ratings;public:FoodRatings(vector<string>&foods,vector<string>&cuisines,vector<int>&ratings){for(inti=0;i<(int)foods.size();++i){food_info[foods[i]]={cuisines[i],ratings[i]};cuisine_ratings[cuisines[i]].insert({-ratings[i],foods[i]});}}voidchangeRating(string food,intnewRating){auto&info=food_info[food];string cuisine=info.first;intoldRating=info.second;cuisine_ratings[cuisine].erase({-oldRating,food});cuisine_ratings[cuisine].insert({-newRating,food});info.second=newRating;}stringhighestRated(string cuisine){returncuisine_ratings[cuisine].begin()->second;}};