C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でリーダーボードを設計する


リーダーボードクラスを設計する必要があるとすると、3つの異なる関数があります-

  • 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の1つのマップを作成します。初期化では、マップがクリアされ、キューが空でない場合は、キューからすべての要素が削除されます。
  • addScore()メソッドは-
      のようになります
    • playerIdが存在する場合、m [playerId]:=m[playerId]+スコア
    • ペア(m [playerId]、playerId)をpqに挿入します
    • それ以外の場合、m[playerId]=スコア
  • top()メソッドは次のようになります
  • ペアのベクトルを一時的に作成し、合計を設定します:=0
  • kが0ではない場合
    • curr:=pqの先頭、pqから削除
    • ifm[currペアの2番目の値]=currペアの最初の値
      • kを1減らします
      • sum:=sum+currの最初の値
      • currをtempに挿入
  • 0からtempのサイズまでの範囲のiの場合
    • 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

  1. C++でプロセスを強制終了します

    n個のプロセスがあるとします。ここでは、各プロセスにPIDまたはプロセスIDと呼ばれる一意のIDがあり、そのPPID(親プロセスID)もそこにあります。 各プロセスには1つの親プロセスしかありませんが、1つ以上の子プロセスがある場合があります。 これは木の構造のようなものです。 PPID =0のプロセスは1つだけです。これは、このプロセスに親プロセスがないことを意味します。すべてのPIDは一意の正の整数になります。 プロセスのリストを表すために2つの整数のリストを使用します。最初のリストには、各プロセスのPIDが含まれ、2番目のリストには対応するPPIDが含まれます。したがって、2つのリ

  2. C++でのリスのシミュレーション

    木、リス、そしていくつかのナッツがあります。位置は、2Dグリッドのセルで表されます。あなたの目標は、リスがすべてのナッツを集めて、それらを1つずつ木の下に置くための最小距離を見つけることです。リスは一度に最大で1つのナットしかとることができず、隣接するセルに向かって上下左右の4つの方向に移動できます。距離は移動回数で表されます。 したがって、入力が高さ:5幅:7木の位置:[2,2]リス:[4,4]ナッツ:[[3,0]、[2,5]]の場合、出力は12になります。 、 これを解決するには、次の手順に従います- 関数calc()を定義します。これには、x1、y1、x2、y2、が必要で