สมมติว่าเราต้องออกแบบคลาสลีดเดอร์บอร์ด มีสามฟังก์ชันที่แตกต่างกัน –
- addScore(playerId, score) - สิ่งนี้จะอัปเดตกระดานผู้นำโดยเพิ่มคะแนนให้กับคะแนนของผู้เล่นที่กำหนด เมื่อไม่มีผู้เล่นดังกล่าวที่มี id ที่ระบุในกระดานผู้นำ ให้เพิ่มเขาในกระดานผู้นำด้วยคะแนนที่กำหนด
- top(K) - จะคืนค่าผลรวมคะแนนของผู้เล่น K อันดับต้นๆ
- reset(playerId) − สิ่งนี้จะรีเซ็ตคะแนนของผู้เล่นด้วย id ที่ระบุเป็น 0 รับประกันได้ว่าผู้เล่นถูกเพิ่มในกระดานผู้นำก่อนที่จะเรียกใช้ฟังก์ชันนี้
เริ่มแรก กระดานผู้นำควรว่างเปล่า
หากเราดำเนินการดังต่อไปนี้ −
- ลีดเดอร์บอร์ดลีดเดอร์บอร์ด =ลีดเดอร์บอร์ดใหม่ ();
- ลีดเดอร์บอร์ด.addScore(1,73); // ลีดเดอร์บอร์ดคือ [[1,73]];
- ลีดเดอร์บอร์ด.addScore(2,56); // ลีดเดอร์บอร์ดคือ [[1,73],[2,56]];
- ลีดเดอร์บอร์ด.addScore(3,39); // ลีดเดอร์บอร์ดคือ [[1,73],[2,56],[3,39]];
- ลีดเดอร์บอร์ด.addScore(4,51); // ลีดเดอร์บอร์ดคือ [[1,73],[2,56],[3,39],[4,51]];
- ลีดเดอร์บอร์ด.addScore(5,4); // ลีดเดอร์บอร์ดคือ [[1,73],[2,56],[3,39],[4,51],[5,4]];
- ลีดเดอร์บอร์ด.top(1); // คืนค่า 73;
- ลีดเดอร์บอร์ด.รีเซ็ต(1); // ลีดเดอร์บอร์ดคือ [[2,56],[3,39],[4,51],[5,4]];
- ลีดเดอร์บอร์ด.รีเซ็ต(2); // ลีดเดอร์บอร์ดคือ [[3,39],[4,51],[5,4]];
- ลีดเดอร์บอร์ด.addScore(2,51); // ลีดเดอร์บอร์ดคือ [[2,51],[3,39],[4,51],[5,4]];
- ลีดเดอร์บอร์ด.top(3); // คืนค่า 141 =51 + 51 + 39;
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดลำดับความสำคัญของคิวของคู่จำนวนเต็มที่เรียกว่า pq สร้างหนึ่งแมปของคีย์ประเภท int และค่าประเภท int m สำหรับการเริ่มต้น มันจะล้างแผนที่ และถ้าคิวไม่ว่าง ให้ลบองค์ประกอบทั้งหมดออกจากคิว
- เมธอด addScore() จะเป็น −
- ถ้ามี playerId แสดงว่า m[playerId] :=m[playerId] + score
- แทรกคู่ (m[playerId], playerId) ลงใน pq
- มิฉะนั้น m[playerId] =คะแนน
- เมธอด top() จะเป็นแบบนี้
- สร้างเวกเตอร์ของคู่ temp, set sum :=0
- ในขณะที่ k ไม่ใช่ 0
- curr :=ด้านบนของ pq ลบออกจาก pq
- ถ้า m[ค่าที่สองของคู่สกุลเงิน] =ค่าแรกของคู่สกุลเงิน
- ลด k ขึ้น 1
- sum :=sum + ค่าแรกของสกุลเงิน
- ใส่เคอร์เซอร์ลงในอุณหภูมิ
- สำหรับ i ในช่วง 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