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の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
理解を深めるために、次の実装を見てみましょう-
#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
-
C++でプロセスを強制終了します
n個のプロセスがあるとします。ここでは、各プロセスにPIDまたはプロセスIDと呼ばれる一意のIDがあり、そのPPID(親プロセスID)もそこにあります。 各プロセスには1つの親プロセスしかありませんが、1つ以上の子プロセスがある場合があります。 これは木の構造のようなものです。 PPID =0のプロセスは1つだけです。これは、このプロセスに親プロセスがないことを意味します。すべてのPIDは一意の正の整数になります。 プロセスのリストを表すために2つの整数のリストを使用します。最初のリストには、各プロセスのPIDが含まれ、2番目のリストには対応するPPIDが含まれます。したがって、2つのリ
-
C++でのリスのシミュレーション
木、リス、そしていくつかのナッツがあります。位置は、2Dグリッドのセルで表されます。あなたの目標は、リスがすべてのナッツを集めて、それらを1つずつ木の下に置くための最小距離を見つけることです。リスは一度に最大で1つのナットしかとることができず、隣接するセルに向かって上下左右の4つの方向に移動できます。距離は移動回数で表されます。 したがって、入力が高さ:5幅:7木の位置:[2,2]リス:[4,4]ナッツ:[[3,0]、[2,5]]の場合、出力は12になります。 、 これを解決するには、次の手順に従います- 関数calc()を定義します。これには、x1、y1、x2、y2、が必要で