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

C++ में हटाएं और कमाएं

मान लीजिए कि हमारे पास पूर्णांकों की एक सरणी संख्या है, हम सरणी पर कुछ संचालन कर सकते हैं। यहां प्रत्येक ऑपरेशन में, हम कोई भी अंक [i] चुनते हैं और अंक अर्जित करने के लिए इसे हटाते हैं [i] अंक अर्जित करते हैं। हमें अंक [i] - 1 या अंक [i] + 1 के बराबर प्रत्येक तत्व को हटाना होगा। प्रारंभ में बिंदु 0 है। हमें इस तरह के संचालन को लागू करके अधिकतम अंक प्राप्त करना होगा। तो अगर इनपुट [3,4,2] जैसा है, तो आउटपुट 6 होगा। तो ऐसा इसलिए है, क्योंकि अगर हम 4 को हटाते हैं, तो हमें 4 अंक मिलेंगे, फलस्वरूप 3 भी हटा दिए जाएंगे। फिर 2 अंक प्राप्त करने के लिए 2 हटाएं। कुल 6 अंक अर्जित किए गए।

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

  • n :=nums array का आकार, मैप को परिभाषित करें m, ret :=0, तत्वों की आवृत्ति को nums में m में स्टोर करें

  • सीएनटी:=0

  • प्रत्येक जोड़ी के लिए यह मी

    • x :=इसकी कुंजी

    • अस्थायी :=x * इसका मान

    • it1 :=इसके पिछले को इंगित करें, और it2 :=it1 के पिछले को इंगित करें

    • यदि cnt>=1 और x - इसकी कुंजी1> 1 है, तो अस्थायी :=m[it1 की कुंजी]

    • अन्यथा जब cnt>=2, तब temp :=temp + m[key of it2]

    • a =m[key of it1] यदि cnt>=1, अन्यथा 0

    • एम [इसकी कुंजी]:=अधिकतम तापमान और एक

    • ret :=अधिकतम रिट और अस्थायी

    • 1 द्वारा cnt बढ़ाएँ

  • वापसी रिट

उदाहरण(C++)

आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int deleteAndEarn(vector<int>& nums) {
      int n = nums.size();
      map <int, int> m;
      int ret = 0;
      for(int i = 0; i < nums.size(); i++){
         m[nums[i]]++;
      }
      int cnt = 0;
      map <int, int> :: iterator it = m.begin();
      while(it != m.end()){
         int x = it->first;
         int temp = x * it->second;
         map <int, int> :: iterator it1 = prev(it);
         map <int, int> :: iterator it2 = prev(it1);
         if(cnt >= 1 && x - it1->first > 1){
            temp += m[it1->first];
         }
         else if(cnt >= 2){
            temp += m[it2->first];
         }
         m[it->first] = max(temp, cnt >= 1 ? m[it1->first] : 0);
         ret = max(ret, temp);
         it++;
         cnt++;
      }
      return ret;
   }
};
main(){
   vector<int> v = {3,4,2};
   Solution ob;
   cout << (ob.deleteAndEarn(v));
}

इनपुट

[3,4,2]

आउटपुट

6

  1. C++ में वृत्त और आयत ओवरलैपिंग

    मान लीजिए कि हमारे पास एक वृत्त है जिसे (त्रिज्या, xc, yc) के रूप में दर्शाया गया है, यहाँ (xc, yc) वृत्त का केंद्र निर्देशांक है। हमारे पास एक अक्ष-संरेखित आयत भी है जिसे (x1, y1, x2, y2) के रूप में दर्शाया गया है, जहाँ (x1, y1) निचले-बाएँ कोने के निर्देशांक हैं, और (x2, y2) शीर्ष-दाएँ के निर्देशां

  1. डोमिनोज़ और ट्रोमिनो टाइलिंग सी++ . में

    मान लीजिए कि हमारे पास दो प्रकार की आकृतियाँ हैं, डोमिनोज़ और ट्रोमिनो। उन्हें नीचे की तरह घुमाया जा सकता है - एक टाइलिंग में, प्रत्येक वर्ग को एक टाइल से ढंकना चाहिए। यहां दो टाइलिंग अलग-अलग हैं यदि और केवल तभी जब बोर्ड पर दो 4-प्रत्यक्ष रूप से आसन्न कोशिकाएं हों, जैसे कि टाइलिंग में से एक में द

  1. C++ में ट्री नोड्स हटाएं

    मान लीजिए कि हमारे पास एक पेड़ है, इस पेड़ की जड़ें नोड 0 पर हैं, यह इस प्रकार दिया गया है - नोड्स की संख्या नोड्स है ith नोड का मान मान है[i] ith नोड का जनक माता-पिता है[i] हमें प्रत्येक सबट्री को हटाना होगा जिसका नोड्स के मानों का योग 0 है, ऐसा करने के बाद पेड़ में शेष नोड्स की संख्या वापस कर द