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

C++ में k सबलिस्ट्स की न्यूनतम सबसे बड़ी राशि खोजने का कार्यक्रम

मान लीजिए कि हमारे पास संख्याओं की एक सूची है जिसे अंक कहा जाता है और दूसरा मान k है। हम सूची को k गैर-रिक्त उप-सूचियों में विभाजित कर सकते हैं। हमें k उप-सूचियों का न्यूनतम सबसे बड़ा योग ज्ञात करना है।

इसलिए, यदि इनपुट संख्या =[2, 4, 3, 5, 12] k =2 की तरह है, तो आउटपुट 14 होगा, क्योंकि हम सूची को विभाजित कर सकते हैं जैसे:[2, 4, 3, 5] और [ 12].

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

  • एक फ़ंक्शन को परिभाषित करें ठीक (), यह सरणी v, k, x,

    लेगा
  • सीएनटी:=0, योग:=0

  • v −

    . में प्रत्येक तत्व i के लिए
    • यदि योग + i> x, तो -

      • योग :=मैं

      • (cnt 1 से बढ़ाएँ)

    • अन्यथा

      • योग :=योग + मैं

  • जब cnt <=k, अन्यथा असत्य

  • मुख्य विधि से निम्न कार्य करें -

  • निम्न:=0, सेवानिवृत्त:=0, उच्च:=0

  • प्रत्येक तत्व के लिए मैं अंकों में

    • उच्च:=उच्च + मैं

    • रिट:=रिट + आई

    • निम्न :=अधिकतम निम्न और i

  • जबकि कम <=उच्च, करें −

    • मध्य:=निम्न + (उच्च-निम्न)/2

    • यदि ठीक है (अंक, के -1, मध्य) सत्य है, तो -

      • रिट:=मध्य

      • उच्च :=मध्य - 1

    • अन्यथा

      • कम :=मध्य + 1

  • वापसी रिट

उदाहरण

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

#include <bits/stdc++.h>
using namespace std;
bool ok(vector <int>& v, int k, int x){
   int cnt = 0;
   int sum = 0;
   for(int i : v){
      if(sum + i > x){
         sum = i;
         cnt++;
      }
      else{
         sum += i;
      }
   }
   return cnt <= k;
}
int solve(vector<int>& nums, int k) {
   int low = 0;
   int ret = 0;
   int high = 0;
   for(int i : nums){
      high += i;
      ret += i;
      low = max(low, i);
   }
   while(low <= high){
      int mid = low + ( high - low) / 2;
      if(ok(nums, k - 1, mid)){
         ret = mid;
         high = mid - 1;
      }
      else{
         low = mid + 1;
      }
   }
   return ret;
}
int main(){
   vector<int> v = {2, 4, 3, 5, 12};
   int k = 2;
   cout << solve(v, k);
}

इनपुट

{2, 4, 3, 5, 12}, 2

आउटपुट

14

  1. सी ++ में एक पेड़ में सबसे बड़ा सबट्री योग खोजें

    इस समस्या में हमें एक बाइनरी ट्री दिया जाता है। हमारा काम पेड़ में सबसे बड़ा सबट्री योग खोजना है। समस्या का विवरण: बाइनरी ट्री में सकारात्मक और साथ ही नकारात्मक मान होते हैं। और हमें उस सबट्री को खोजने की जरूरत है जिसमें नोड्स की अधिकतम राशि हो। समस्या को समझने के लिए एक उदाहरण लेते हैं,

  1. k गैर-अतिव्यापी उप-सूचियों का योग ज्ञात करने का कार्यक्रम, जिनका योग C++ में अधिकतम है

    मान लीजिए कि हमारे पास संख्याओं की एक सूची है जिसे अंक कहा जाता है, और एक अन्य मूल्य k, हमें k गैर-अतिव्यापी, गैर-रिक्त उप-सूचियों को खोजना होगा जैसे कि उनके योग का योग अधिकतम हो। हम मान सकते हैं कि k, अंकों के आकार से छोटा या उसके बराबर है। इसलिए, यदि इनपुट nums =[11, -1, 2, 1, 6, -24, 11, 9, 6] k

  1. पेड़ के स्तर को खोजने के लिए कार्यक्रम जिसमें सी ++ में न्यूनतम योग है

    मान लीजिए हमारे पास एक बाइनरी ट्री है, इसकी जड़ का स्तर 1 है, इसके बच्चों का स्तर 2 है, और इसी तरह। हमें सबसे छोटा स्तर X खोजना है जैसे कि स्तर X पर नोड्स के सभी मानों का योग न्यूनतम हो। तो अगर पेड़ जैसा है - आउटपुट 2 होगा क्योंकि योग 4 - 10 =-6 है, जो न्यूनतम है। इसे हल करने के लिए, हम इन चरणों