#include <iostream>
#include <unordered_map>
#include <vector>
#include <list>
#include <algorithm>
#include <queue>
using namespace std;
/*
Write a game leader board. Record user id and game score. Return top n players.
*/
struct UserWithScore {
string user_id;
int score;
UserWithScore(string user_id_, int score_): user_id(user_id_), score(score_) {}
};
struct Compare {
bool operator()(UserWithScore a, UserWithScore b) {
return a.score > b.score;
}
};
class GameLeaderBoard {
public:
unordered_map<string,int> ht;
void add_score(string user_id, int game_score) {
auto it = ht.find(user_id);
if (it == ht.end()) {
ht.insert(make_pair(user_id, game_score));
} else {
if (game_score > it->second) {
it->second = game_score;
}
}
}
vector<UserWithScore> get_top_n(int n) {
vector<UserWithScore> out;
priority_queue<UserWithScore, std::vector<UserWithScore>, Compare> min_heap;
for (auto e : ht) {
if (min_heap.size() < n) {
min_heap.push(UserWithScore(e.first, e.second));
} else {
auto it = min_heap.top();
if (it.score < e.second) {
min_heap.pop();
min_heap.push(UserWithScore(e.first, e.second));
}
}
}
while (!min_heap.empty()) {
auto n = min_heap.top();
min_heap.pop();
out.push_back(n);
}
return out;
}
};
void print(vector<UserWithScore> top_n) {
for (int i = 0; i < top_n.size(); i++) {
cout << "user: " << top_n[i].user_id << ", score: " << top_n[i].score << endl;
}
cout << '\n';
}
int main() {
// your code goes here
GameLeaderBoard g1;
g1.add_score("gerald", 10);
g1.add_score("tushar", 20);
g1.add_score("gaurav", 15);
g1.add_score("vishal", 3);
print(g1.get_top_n(3));
g1.add_score("gerald", 30);
print(g1.get_top_n(3));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxxdWV1ZT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8qCldyaXRlIGEgZ2FtZSBsZWFkZXIgYm9hcmQuIFJlY29yZCB1c2VyIGlkIGFuZCBnYW1lIHNjb3JlLiBSZXR1cm4gdG9wIG4gcGxheWVycy4KKi8KCnN0cnVjdCBVc2VyV2l0aFNjb3JlIHsKCXN0cmluZyB1c2VyX2lkOwoJaW50IHNjb3JlOwoJVXNlcldpdGhTY29yZShzdHJpbmcgdXNlcl9pZF8sIGludCBzY29yZV8pOiB1c2VyX2lkKHVzZXJfaWRfKSwgc2NvcmUoc2NvcmVfKSB7fQp9OwoKc3RydWN0IENvbXBhcmUgewoJYm9vbCBvcGVyYXRvcigpKFVzZXJXaXRoU2NvcmUgYSwgVXNlcldpdGhTY29yZSBiKSB7CgkJcmV0dXJuIGEuc2NvcmUgPiBiLnNjb3JlOwoJfQp9OwoKY2xhc3MgR2FtZUxlYWRlckJvYXJkIHsKcHVibGljOgoJdW5vcmRlcmVkX21hcDxzdHJpbmcsaW50PiBodDsKCQkKCXZvaWQgYWRkX3Njb3JlKHN0cmluZyB1c2VyX2lkLCBpbnQgZ2FtZV9zY29yZSkgewoJCWF1dG8gaXQgPSBodC5maW5kKHVzZXJfaWQpOwoJCWlmIChpdCA9PSBodC5lbmQoKSkgewoJCQlodC5pbnNlcnQobWFrZV9wYWlyKHVzZXJfaWQsIGdhbWVfc2NvcmUpKTsKCQl9IGVsc2UgewoJCQlpZiAoZ2FtZV9zY29yZSA+IGl0LT5zZWNvbmQpIHsKCQkJCWl0LT5zZWNvbmQgPSBnYW1lX3Njb3JlOwoJCQl9CgkJfQoJfQoJCgl2ZWN0b3I8VXNlcldpdGhTY29yZT4gZ2V0X3RvcF9uKGludCBuKSB7CgkJdmVjdG9yPFVzZXJXaXRoU2NvcmU+IG91dDsKCQkKCQlwcmlvcml0eV9xdWV1ZTxVc2VyV2l0aFNjb3JlLCBzdGQ6OnZlY3RvcjxVc2VyV2l0aFNjb3JlPiwgQ29tcGFyZT4gbWluX2hlYXA7CgkJCgkJZm9yIChhdXRvIGUgOiBodCkgewoJCQlpZiAobWluX2hlYXAuc2l6ZSgpIDwgbikgewoJCQkJbWluX2hlYXAucHVzaChVc2VyV2l0aFNjb3JlKGUuZmlyc3QsIGUuc2Vjb25kKSk7CgkJCX0gZWxzZSB7CgkJCQlhdXRvIGl0ID0gbWluX2hlYXAudG9wKCk7CgkJCQlpZiAoaXQuc2NvcmUgPCBlLnNlY29uZCkgewoJCQkJCW1pbl9oZWFwLnBvcCgpOwoJCQkJCW1pbl9oZWFwLnB1c2goVXNlcldpdGhTY29yZShlLmZpcnN0LCBlLnNlY29uZCkpOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXdoaWxlICghbWluX2hlYXAuZW1wdHkoKSkgewoJCQlhdXRvIG4gPSBtaW5faGVhcC50b3AoKTsKCQkJbWluX2hlYXAucG9wKCk7CgkJCW91dC5wdXNoX2JhY2sobik7CgkJfQoJCQoJCXJldHVybiBvdXQ7Cgl9Cn07Cgp2b2lkIHByaW50KHZlY3RvcjxVc2VyV2l0aFNjb3JlPiB0b3BfbikgewoJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3Bfbi5zaXplKCk7IGkrKykgewoJCWNvdXQgPDwgInVzZXI6ICIgPDwgdG9wX25baV0udXNlcl9pZCA8PCAiLCBzY29yZTogIiA8PCB0b3BfbltpXS5zY29yZSA8PCBlbmRsOwoJfQoJY291dCA8PCAnXG4nOwp9CgppbnQgbWFpbigpIHsKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCQoJR2FtZUxlYWRlckJvYXJkIGcxOwoJZzEuYWRkX3Njb3JlKCJnZXJhbGQiLCAxMCk7CglnMS5hZGRfc2NvcmUoInR1c2hhciIsIDIwKTsKCWcxLmFkZF9zY29yZSgiZ2F1cmF2IiwgMTUpOwoJZzEuYWRkX3Njb3JlKCJ2aXNoYWwiLCAzKTsKCXByaW50KGcxLmdldF90b3BfbigzKSk7CgkKCWcxLmFkZF9zY29yZSgiZ2VyYWxkIiwgMzApOwoJcHJpbnQoZzEuZ2V0X3RvcF9uKDMpKTsKCQoJcmV0dXJuIDA7Cn0=