Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में एक लीडरबोर्ड डिज़ाइन करें


मान लीजिए कि हमें एक लीडरबोर्ड वर्ग डिजाइन करना है, तीन अलग-अलग कार्य हैं -

  • addScore(playerId, Score) - यह दिए गए खिलाड़ी के स्कोर में स्कोर जोड़कर लीडरबोर्ड को अपडेट करेगा। जब लीडरबोर्ड में दी गई आईडी वाला ऐसा कोई खिलाड़ी नहीं है, तो उसे दिए गए स्कोर के साथ लीडरबोर्ड में जोड़ें।
  • top(K) - यह शीर्ष K खिलाड़ियों के स्कोर का योग लौटाएगा।
  • reset(playerId) - यह दिए गए आईडी वाले खिलाड़ी के स्कोर को 0 पर रीसेट कर देगा। यह गारंटी है कि खिलाड़ी को इस फ़ंक्शन को कॉल करने से पहले लीडरबोर्ड में जोड़ा गया था।

प्रारंभ में, लीडरबोर्ड खाली होना चाहिए।

अगर हम नीचे की तरह ऑपरेशन करते हैं -

  • लीडरबोर्ड लीडरबोर्ड =नया लीडरबोर्ड ();
  • लीडरबोर्ड.एडस्कोर(1,73); // लीडरबोर्ड है [[1,73]];
  • लीडरबोर्ड.एडस्कोर(2,56); // लीडरबोर्ड है [[1,73],[2,56]];
  • लीडरबोर्ड.एडस्कोर(3,39); // लीडरबोर्ड है [[1,73],[2,56],[3,39]];
  • लीडरबोर्ड.एडस्कोर(4,51); // लीडरबोर्ड है [[1,73],[2,56],[3,39],[4,51]];
  • लीडरबोर्ड.एडस्कोर(5,4); // लीडरबोर्ड है [[1,73],[2,56],[3,39],[4,51],[5,4]];
  • लीडरबोर्ड.टॉप(1); // 73 लौटाता है;
  • लीडरबोर्ड.रीसेट(1); // लीडरबोर्ड है [[2,56],[3,39],[4,51],[5,4]];
  • लीडरबोर्ड.रीसेट(2); // लीडरबोर्ड है [[3,39],[4,51],[5,4]];
  • लीडरबोर्ड.एडस्कोर(2,51); // लीडरबोर्ड है [[2,51],[3,39],[4,51],[5,4]];
  • लीडरबोर्ड.टॉप(3); // रिटर्न 141 =51 + 51 + 39;

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • pq नामक पूर्णांक जोड़े की प्राथमिकता कतार को परिभाषित करें, int प्रकार कुंजियों और int प्रकार मानों का एक नक्शा बनाएं। आरंभीकरण के लिए, यह मानचित्र को साफ़ कर देगा, और यदि कतार खाली नहीं है, तो कतार से सभी तत्वों को हटा दें।
  • एडस्कोर () विधि इस तरह होगी −
    • यदि खिलाड़ी आईडी मौजूद है, तो m[playerId] :=m[playerId] + स्कोर
    • पीक्यू में एक जोड़ी (m[playerId], playerId) डालें
    • अन्यथा m[playerId] =स्कोर
  • शीर्ष () विधि इस तरह होगी
  • जोड़े अस्थायी का एक वेक्टर बनाएं, योग सेट करें:=0
  • जबकि k 0 नहीं है
    • curr :=pq के ऊपर, pq से हटाएं
    • अगर m[कर्र पेयर का दूसरा मान] =कर्व पेयर का पहला मान
      • k को 1 से घटाएं
      • योग :=योग + मुद्रा का प्रथम मान
      • अस्थायी में करंट डालें
  • मैं के लिए 0 से लेकर अस्थायी आकार के बीच
    • अस्थायी[i] pq में डालें
  • रीसेट () फ़ंक्शन इस तरह होगा -
    • 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++ . में विकर्ण ट्रैवर्स II

    मान लीजिए कि हमारे पास nums नामक सूचियों की एक सूची है, हमें अंकों के सभी तत्वों को विकर्ण क्रम में दिखाना होगा। तो, अगर इनपुट पसंद है तो आउटपुट [1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16] होगा इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - एक सरणी रिट परिभाषित करें एक 2डी सरणी को परिभाषित

  1. सी ++ में प्रक्रिया को मारें

    मान लीजिए कि हमारे पास n प्रक्रियाएं हैं, यहां प्रत्येक प्रक्रिया की एक विशिष्ट आईडी होती है जिसे PID या प्रक्रिया आईडी कहा जाता है और उसका PPID (पैरेंट प्रोसेस आईडी) भी होता है। प्रत्येक प्रक्रिया में केवल एक पैरेंट प्रक्रिया होती है, लेकिन इसमें एक या अधिक चाइल्ड प्रक्रियाएं हो सकती हैं। यह एक प

  1. सी ++ में गिलहरी सिमुलेशन

    एक पेड़, एक गिलहरी, और कई नट हैं। स्थितियों को 2डी ग्रिड में कोशिकाओं द्वारा दर्शाया जाता है। आपका लक्ष्य गिलहरी के लिए सभी नटों को इकट्ठा करने और उन्हें एक-एक करके पेड़ के नीचे रखने के लिए न्यूनतम दूरी का पता लगाना है। गिलहरी एक समय में केवल एक अखरोट ले सकती है और चार दिशाओं में - ऊपर, नीचे, बाएँ औ