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

C++ का उपयोग करके वह संख्या ज्ञात कीजिए जिसका दिए गए ऐरे रेंज के साथ XOR का योग अधिकतम है

एक समस्या को हल करने के लिए जिसमें हमें एक सरणी और कुछ प्रश्न दिए जाते हैं। अब प्रत्येक प्रश्न में, हमें एक श्रेणी दी गई है। अब हमें एक ऐसी संख्या ज्ञात करने की आवश्यकता है कि x के साथ उनके xor का योग अधिकतम हो, उदाहरण के लिए

Input : A = {20, 11, 18, 2, 13}
Three queries as (L, R) pairs
1 3
3 5
2 4
Output : 2147483629
2147483645
2147483645

इस समस्या में, हम प्रत्येक स्थिति में संख्याओं में मौजूद 1 के उपसर्ग की गणना करने जा रहे हैं, क्योंकि हमने अपनी संख्या की पूर्व-गणना कर ली है, इसलिए दी गई श्रेणी में L से R तक की संख्या ज्ञात करने के लिए, हमें यह करने की आवश्यकता है आर तक अनुमानित घटाना एल तक माना जाता है।

समाधान खोजने के लिए दृष्टिकोण

इस दृष्टिकोण में, जैसा कि हमें अधिकतम योग खोजने की आवश्यकता होती है, इसलिए हमें xor के अधिकांश बिट्स को 1 के बराबर बनाने की आवश्यकता होती है; इसलिए हम जांचते हैं कि क्या किसी बिट के लिए यदि कोई 0 की संख्या से अधिक है तो हम उस बिट x को रीसेट कर देते हैं क्योंकि अब अधिकांश संख्या में वह बिट 1 के बराबर है, इसलिए जब हम उस बहुमत 1 को 0 के साथ जोड़ते हैं तो अंततः हमारे पास बहुमत होता है वह बिट 1 के बराबर है, इस प्रकार हम अपने उत्तर को अधिकतम करते हैं।

उदाहरण

उपरोक्त दृष्टिकोण के लिए C++ कोड

#include <bits/stdc++.h>
using namespace std;
#define MAX 2147483647 // 2^31 - 1
int prefix[100001][32]; // the prefix array
void prefix_bit(int A[], int n){ // taking prefix count of 1's present
    for (int j = 0; j < 32; j++) // we keep 0th count as 0 and our prefix array starts with index 1
        prefix[0][j] = 0;
    for (int i = 1; i <= n; i++){ // making our prefix array
        int a = A[i - 1]; // ith element
        for (int j = 0; j < 32; j++){ // as our number is less than 2^32 so we traverse for bit 0 to 31
            int x = 1 << j; // traversing in bits
            if (a & x) // if this bit is one so we make the prefix count as prevcount + 1
                prefix[i][j] = 1 + prefix[i - 1][j];
            else
                prefix[i][j] = prefix[i - 1][j];
       }
   }
}
int maximum_num(int l, int r){
    int numberofbits = r - l + 1; // the number of elements in the range hence the number of bits
    int X = MAX; // we take the max value such that all of it's bits are one
    // Iterating over each bit
    for (int i = 0; i < 31; i++){
        int x = prefix[r][i] - prefix[l - 1][i]; // calculating the number of set bits in the given range
        if (x >= numberofbits - x){ // is number of 1's is more than number of 0's
            int currentbit = 1 << i; // we set the current bit to prefix for toggling that bit in x
            X = X ^ currentbit; // we make toggle that bit from 1 to 0
        }
    }
    return X; // answer
}
int main(){
    int n = 5, q = 3; // number of element in our array and number of queries present
    int A[] = { 210, 11, 48, 22, 133 }; // elements in our array
    int L[] = { 1, 4, 2 }, R[] = { 3, 14, 4 }; // given queries
    prefix_bit(A, n); // creating prefix bit array
    for (int i = 0; i < q; i++)
       cout << maximum_num(L[i], R[i]) << "\n";
    return 0;
}

आउटपुट

2147483629
2147483647
2147483629

उपरोक्त कोड की व्याख्या

इस दृष्टिकोण में, हम पहले प्रत्येक बिट के लिए 1 के वर्तमान की उपसर्ग गणना की गणना करते हैं। अब जब हमें यह गिनती मिलती है, तो हमने अपनी सबसे बड़ी समस्या हल कर ली है जो प्रश्नों को पार कर रही थी। अभी तक, हम प्रत्येक श्रेणी को पार नहीं करने जा रहे हैं। तो हम अब हमारे उपसर्ग सरणी के माध्यम से इसकी गणना कर सकते हैं। हमारा मुख्य तर्क यह है कि जब हम ऐसी स्थिति का सामना करते हैं जहां सेट बिट संख्या रीसेट बिट्स की संख्या से अधिक होती है, तो हम सीमा में रीसेट और सेट बिट्स की संख्या की गणना करते हैं। इसलिए, हम अपने x में उस बिट को अभी रीसेट करते हैं क्योंकि हमने x को 2^31 - 1 के साथ प्रारंभ किया है, इसलिए इसके सभी बिट्स सेट हो जाएंगे, और हम x में बिट्स को टॉगल करके अपना उत्तर ढूंढते हैं।

निष्कर्ष

इस ट्यूटोरियल में, हम उस संख्या को खोजने के लिए एक समस्या का समाधान करते हैं जिसका किसी दिए गए सरणी श्रेणी के साथ एक्सओआर का योग अधिकतम है। हमने इस समस्या के लिए C++ प्रोग्राम और संपूर्ण दृष्टिकोण (Normal) भी सीखा जिसके द्वारा हमने इस समस्या को हल किया। हम उसी प्रोग्राम को अन्य भाषाओं जैसे सी, जावा, पायथन और अन्य भाषाओं में लिख सकते हैं। हमें उम्मीद है कि आपको यह ट्यूटोरियल मददगार लगा होगा।


  1. C++ में अधिकतम nCr मान के साथ दिए गए सरणी से एक जोड़ी खोजें

    अवधारणा एन सकारात्मक पूर्णांक के एक सरणी गिरफ्तारी [] दिए जाने के संबंध में, कार्य सरणी से गिरफ्तार [i] और गिरफ्तारी [जे] तत्वों को निर्धारित करना है जैसे कि गिरफ्तारी [i] कैर [जे] सबसे अधिक संभव है। 1 से अधिक मान्य जोड़े के संबंध में, उनमें से किसी एक को प्रिंट करें। इनपुट arr[] = {4, 1, 2} आउट

  1. अधिकतम अभाज्य संख्या जिसका योग C++ में दिए गए N के बराबर है

    इस समस्या में, हमें एक संख्या n दी गई है। हमारा कार्य उन अभाज्य संख्याओं की अधिकतम संख्या ज्ञात करना है जिनका योग दिए गए N के बराबर है। यहां, हम अभाज्य संख्याओं की वह अधिकतम संख्या पाएंगे जो जोड़ने पर संख्या के बराबर होगी। अभाज्य संख्याएँ वे संख्याएँ होती हैं जिन्हें स्वयं या एक से विभाजित किया जा

  1. C++ का उपयोग करके किसी सरणी में किसी संख्या की आवृत्ति ज्ञात करें।

    मान लीजिए कि हमारे पास एक सरणी है। एन विभिन्न तत्व हैं। हमें सरणी में एक तत्व की आवृत्ति की जांच करनी है। मान लीजिए A =[5, 12, 26, 5, 3, 4, 15, 5, 8, 4], अगर हम 5 की बारंबारता ज्ञात करने की कोशिश करते हैं, तो यह 3 होगा। इसे हल करने के लिए, हम सरणी को बाईं ओर से स्कैन करेंगे, यदि तत्व दिए गए नंबर के