假设我们必须设计一个排行榜类,有三个不同的功能-
addScore(playerId,score)-这将通过将分数添加到给定玩家的分数来更新排行榜。如果排行榜中没有这样的具有给定ID的玩家,请将其添加到具有给定分数的排行榜中。
top(K)-这将返回前K名选手的得分总和。
reset(playerId)-这会将具有给定id的玩家的得分重置为0。确保在调用此函数之前将玩家添加到排行榜。
最初,排行榜应为空。
如果我们执行如下操作-
排行榜排行榜=新的排行榜();
Leaderboard.addScore(1,73); //页首横幅为[[1,73]];
Leaderboard.addScore(2,56); //页首横幅为[[1,73],[2,56]];
Leaderboard.addScore(3,39); //页首横幅为[[1,73],[2,56],[3,39]];
Leaderboard.addScore(4,51); //页首横幅为[[1,73],[2,56],[3,39],[4,51]];
Leaderboard.addScore(5,4); //页首横幅为[[1,73],[2,56],[3,39],[4,51],[5,4]];
Leaderboard.top(1); //返回73;
Leaderboard.reset(1); //页首横幅为[[2,56],[3,39],[4,51],[5,4]];
Leaderboard.reset(2); //页首横幅为[[3,39],[4,51],[5,4]];
Leaderboard.addScore(2,51); //页首横幅为[[2,51],[3,39],[4,51],[5,4]];
Leaderboard.top(3); //返回141 = 51 + 51 + 39;
为了解决这个问题,我们将遵循以下步骤-
定义一个称为pq的整数对的优先级队列,制作一个int类型键和int类型值m的映射。对于初始化,它将清除映射,如果队列不为空,则从队列中删除所有元素。
该addScore()
方法将像-
如果存在playerId,则m [playerId]:= m [playerId] +得分
在pq中插入一对(m [playerId],playerId)
否则m [playerId] =得分
该top()
方法会像
制作温度对的向量,设置sum:= 0
当k不为0时
将k减1
sum:= sum + curr的第一个值
将curr插入temp
curr:= pq的顶部,从pq中删除
如果m [货币对的第二个值] =货币对的第一个值
对于我在0到温度范围内
将temp [i]插入pq
该reset()
方法将像-
m [playerId] = 0
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Leaderboard { public: priority_queue< pair <int,int> > pq; map < int, int > m; Leaderboard() { m.clear(); while(!pq.empty())pq.pop(); } void addScore(int playerId, int score) { if(m.find(playerId)!=m.end()){ m[playerId] += score; } else m[playerId] = score;; pq.push({m[playerId], playerId}); } int top(int k) { vector < pair <int,int> > temp; int sum = 0; while(k){ pair <int, int> curr = pq.top(); pq.pop(); if(m[curr.second] == curr.first){ k--; sum += curr.first; temp.push_back(curr); } } for(int i = 0; i < temp.size(); i++)pq.push(temp[i]); return sum; } void reset(int playerId) { m[playerId] = 0; } }; main(){ Leaderboard ob; ob.addScore(1,73); ob.addScore(2,56); ob.addScore(3,39); ob.addScore(4,51); ob.addScore(5,4); cout <<ob.top(1) << endl; ob.reset(1); ob.reset(2); ob.addScore(2,51); cout <<ob.top(2) << endl; }
Initialize leader board then use the functions to see different results. See the main() function
输出结果
73 102