用C ++设计排行榜

假设我们必须设计一个排行榜类,有三个不同的功能-

  • 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

例子(C ++)

让我们看下面的实现以更好地理解-

#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