কম্পিউটার টিউটোরিয়াল

C++-এ লিডারবোর্ড ডিজাইন


মনে করুন আমাদের একটি Leaderboard ক্লাস ডিজাইন করতে হবে, তিনটি ভিন্ন ফাংশন আছে -

  • `addScore(playerId, score)` - এটি দিয়ে দেয়া `playerId`-র স্কোরে `score` যোগ করে লিডারবোর্ড আপডেট করবে। যদি দিয়ে দেয়া আইডিয়ের প্লেয়ার লিডারবোর্ডে না থাকে, তবে তাকে দিয়ে দেয়া স্কোরসহ লিডারবোর্ডে যোগ করবে।
  • `top(K)` - এটি টপ K প্লেয়ারের স্কোর সমষ্টি রিটার্ন করবে।
  • `reset(playerId)` - এটি দিয়ে দেয়া আইডির প্লেয়ারের স্কোর ০ করবে। এটি গ্যারান্টিড যে প্লেয়ারটি এই ফাংশন কল করার আগে লিডারবোর্ডে যোগ করা হয়েছিল।

প্রাথমিকভাবে লিডারবোর্ড খালি থাকবে।

যদি আমরা নিচের অপারেশনগুলো পারফর্ম করি -

  • Leaderboard leaderboard = new Leaderboard ();
  • leaderboard.addScore(1,73); // leaderboard is [[1,73]];
  • leaderboard.addScore(2,56); // leaderboard is [[1,73],[2,56]];
  • leaderboard.addScore(3,39); // leaderboard is [[1,73],[2,56],[3,39]];
  • leaderboard.addScore(4,51); // leaderboard is [[1,73],[2,56],[3,39],[4,51]];
  • leaderboard.addScore(5,4); // leaderboard is [[1,73],[2,56],[3,39],[4,51],[5,4]];
  • leaderboard.top(1); // returns 73;
  • leaderboard.reset(1); // leaderboard is [[2,56],[3,39],[4,51],[5,4]];
  • leaderboard.reset(2); // leaderboard is [[3,39],[4,51],[5,4]];
  • leaderboard.addScore(2,51); // leaderboard is [[2,51],[3,39],[4,51],[5,4]];
  • leaderboard.top(3); // returns 141 = 51 + 51 + 39;

এটি সমাধান করতে আমরা নিচের ধাপগুলো অনুসরণ করব -

  • একটি প্রায়োরিটি কিউ `pq` (ইন্টিজার পেয়ার), এবং একটি ম্যাপ `m` (ইন্ট কি এবং ইন্ট ভ্যালু) সংজ্ঞায়িত করুন। ইনিশিয়ালাইজেশনে, ম্যাপ ক্লিয়ার করুন, এবং যদি কিউ খালি না থাকে, তবে সব এলিমেন্ট ডিলিট করুন।
  • `addScore()` মেথড নিচের মোতাবিক হবে -
    • যদি `playerId` বিদ্যমান থাকে, তবে `m[playerId] := m[playerId] + score`
    • `(m[playerId], playerId)` পেয়ারটি `pq`-তে ইনসার্ট করুন
    • অন্যথায় `m[playerId] = score`
  • `top()` মেথড নিচের মোতাবিক হবে -
  • `temp` নামক একটি পেয়ার ভেক্টর, `sum := 0` সেট করুন
  • যখন `k` ০ না হয়
    • `curr := pq`-এর টপ, `pq`-থেকে ডিলিট করুন
    • যদি `m[curr.second] == curr.first`
      • `k`-কে ১ কমান
      • `sum := sum + curr.first`
      • `curr`-কে `temp`-এ ইনসার্ট করুন
  • `i` = 0 থেকে `temp`-এর আকার পর্যন্ত
    • `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++-এ Line Reflection: ২D প্লেনে বিন্দুগুলোর Y-অক্ষ সমান্তরাল প্রতিফলন লাইন আছে কিনা যাচাই করা

  2. C++-এ ডায়াগোনাল ট্রায়ভার্স II

  3. প্রসেস কিল করা (Kill Process) C++-এ

  4. স্কোয়ারেল সিমুলেশন (Squirrel Simulation) C++-এ