ধরুন আমাদের একটি লিডারবোর্ড ক্লাস ডিজাইন করতে হবে, তিনটি ভিন্ন ফাংশন আছে −
- addScore(playerId, স্কোর) - এটি প্রদত্ত প্লেয়ারের স্কোরে স্কোর যোগ করে লিডারবোর্ড আপডেট করবে। লিডারবোর্ডে প্রদত্ত আইডি সহ এমন কোন খেলোয়াড় না থাকলে, তাকে প্রদত্ত স্কোর সহ লিডারবোর্ডে যোগ করুন।
- টপ(K) − এটি সেরা K খেলোয়াড়দের স্কোর যোগফল ফিরিয়ে দেবে।
- reset(playerId) − এটি প্রদত্ত আইডি সহ প্লেয়ারের স্কোর 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] =স্কোর
- টপ() পদ্ধতিটি এরকম হবে
- জোড়ার তাপমাত্রার একটি ভেক্টর তৈরি করুন, যোগফল সেট করুন :=0
- যদিও k 0
- নয়
- curr :=pq এর শীর্ষ, pq থেকে মুছুন
- যদি m[curr pair এর দ্বিতীয় মান] =curr pair এর প্রথম মান
- k কে 1 দ্বারা কমিয়ে দিন
- সমষ্টি :=যোগফল + curr এর প্রথম মান
- টেম্পে curr ঢোকান
- আমি 0 থেকে টেম্পের মাপের মধ্যে
- pq-এ temp[i] ঢোকান
- রিসেট() ফাংশন −
- এর মত হবে
- 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