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

C++ में बाइनरी लिफ्टिंग का उपयोग करते हुए N संख्याओं के उपसर्ग योग में X से बड़ा या उसके बराबर पहला तत्व

इस समस्या में, हमें एक सरणी arr [] दिया जाता है जिसमें N संख्याएँ और एक पूर्णांक मान x होता है। हमारा काम है बाइनरी लिफ्टिंग का उपयोग करके एन नंबरों के उपसर्ग योग में एक्स से बड़ा या उसके बराबर पहला तत्व खोजने के लिए एक प्रोग्राम बनाना

उपसर्ग योग एक सरणी के तत्वों का एक सरणी है जिसका प्रत्येक तत्व प्रारंभिक सरणी में उस अनुक्रमणिका तक सभी तत्वों का योग है।

उदाहरण - सरणी [] ={5, 2, 9, 4, 1}

उपसर्गसुमअरे [] ={5, 7, 16, 20, 21}

समस्या को समझने के लिए एक उदाहरण लेते हैं,

Input: arr[] = {5, 2, 9, 4, 1}, X = 19
Output: 3

समाधान दृष्टिकोण

यहां, हम बाइनरी लिफ्टिंग . की अवधारणा का उपयोग करके समस्या का समाधान करेंगे . बाइनरी लिफ्टिंग दी गई संख्या के मूल्य को 2 की शक्तियों (बिट्स को फ़्लिप करके) 0 से एन तक बढ़ा रही है।

हम बाइनरी ट्री उठाने के समान एक अवधारणा पर विचार करेंगे जहां हम 'पी' इंडेक्स का प्रारंभिक मूल्य पाएंगे। यह सुनिश्चित करने के लिए बिट्स को फ़्लिप करके बढ़ाया जाता है कि मान X से अधिक नहीं है। अब, हम इस स्थिति 'P' के साथ लिफ्ट पर भी विचार करेंगे।

इसके लिए, हम संख्या के बिट्स को इस तरह से फ़्लिप करना शुरू करेंगे कि i-th बिट फ़्लिप योग को X से बड़ा न बना दे। अब, हमारे पास 'P' के मान के आधार पर दो केस हैं -

या तो लक्ष्य स्थिति 'स्थिति + 2^i . के बीच स्थित है ' और 'स्थिति + 2^(i+1) ' जहां ith लिफ्ट ने मूल्य में वृद्धि की। या, लक्ष्य स्थिति 'स्थिति . के बीच स्थित है ' और 'स्थिति + 2^i '।

इसका उपयोग करके हम सूचकांक की स्थिति पर विचार करेंगे।

उदाहरण

हमारे समाधान की कार्यप्रणाली को दर्शाने के लिए कार्यक्रम

#include <iostream>
#include <math.h>
using namespace std;
void generatePrefixSum(int arr[], int prefSum[], int n){
   prefSum[0] = arr[0];
   for (int i = 1; i < n; i++)
      prefSum[i] = prefSum[i - 1] + arr[i];
}
int findPreSumIndexBL(int prefSum[], int n, int x){
   int P = 0;
   int LOGN = log2(n);
   if (x <= prefSum[0])
      return 0;
   for (int i = LOGN; i >= 0; i--) {
      if (P + (1 << i) < n &&
         prefSum[P + (1 << i)] < x) {
         P += (1 << i);
      }
   }
   return P + 1;
}
int main(){
   int arr[] = { 5, 2, 9, 4, 1 };
   int X = 19;
   int n = sizeof(arr) / sizeof(arr[0]);
   int prefSum[n] = { 0 };
   generatePrefixSum(arr, prefSum, n);
   cout<<"The index of first elements of the array greater than the given number is ";
   cout<<findPreSumIndexBL(prefSum, n, X);
   return 0;
}

आउटपुट

The index of first elements of the array greater than the given number is 3

  1. C++ . में प्रथम n प्राकृत संख्याओं के योग का योग

    इस समस्या में पहली n प्राकृत संख्याओं के योग का योग ज्ञात करने के लिए, हम 1 से n तक की सभी संख्याओं का योग ज्ञात करेंगे और योग ज्ञात करने के लिए उन्हें एक साथ जोड़ेंगे। आइए अवधारणा के बारे में जानने के लिए एक उदाहरण लेते हैं, Input : 4 Output : 10 Explanation : Sum of first 1 natural number = 1 Sum

  1. सी ++ प्रोग्राम एक सरणी के तत्वों को जोड़ने के लिए जब तक कि प्रत्येक तत्व k . से अधिक या उसके बराबर न हो जाए

    हमारे पास अवर्गीकृत तत्वों की सरणी है अर्थात arr[] और एक पूर्णांक K है, और हमें आवश्यक न्यूनतम चरणों की संख्या ज्ञात करनी होगी जिसमें सभी तत्वों को से बड़ा या उसके बराबर बनाने के लिए सरणी के तत्वों को जोड़ा जाएगा। कश्मीर . हम सरणी के दो तत्व जोड़ सकते हैं और उन्हें एक बना सकते हैं। उदाहरण Input: ar

  1. किसी सरणी के तत्वों को तब तक जोड़ना जब तक कि प्रत्येक तत्व C++ में k से बड़ा या उसके बराबर न हो जाए।

    सरणी - एक सरणी एक ही डेटा प्रकार के तत्वों का एक कंटेनर होता है, जिसके तत्व 0 अनुक्रमित होते हैं। इस समस्या में, हम पूर्णांकों की एक सरणी का उपयोग करेंगे। और जांचें कि सभी तत्व दी गई संख्या से बड़े हैं या नहीं। यहां हम जांच करेंगे कि सरणी के सभी तत्व दिए गए संख्या k से बड़े या बराबर हैं या नहीं। यद