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

C++ में बिटवाइज़ OR k के बराबर वाले अधिकतम लंबाई के उपसमुच्चय (Maximum subset with bitwise OR equal to k)


समस्या कथन

गैर-ऋणात्मक पूर्णांकों की एक सरणी और एक पूर्णांक k दिया गया है, बिटवाइज़ OR k के बराबर वाले अधिकतम लंबाई के उपसमुच्चय (subset) को ढूंढें।

उदाहरण

यदि दी गई इनपुट सरणी = [1, 4, 2] और k = 3 है तो आउटपुट है: [1, 2]
1 और 2 का बिटवाइज़ OR 3 के बराबर है। लंबाई 2 से अधिक का उपसमुच्चय प्राप्त करना संभव नहीं है।

एल्गोरिदम

बिटवाइज़ OR के गुण नीचे दिए गए हैं:

0 OR 0 = 0
1 OR 0 = 1
1 OR 1 = 1
  • k के बाइनरी प्रतिनिधित्व में उन सभी स्थितियों के लिए जहां बिट 0 के बराबर है, परिणामी उपसमुच्चय के सभी तत्वों के बाइनरी प्रतिनिधित्व में संबंधित स्थिति अनिवार्य रूप से 0 होनी चाहिए
  • दूसरी ओर, k में उन स्थितियों के लिए जहां बिट 1 के बराबर है, कम से कम एक तत्व होना चाहिए जिसकी संबंधित स्थिति में 1 हो। बाकी तत्वों में उस स्थिति में 0 या 1 हो सकता है, इससे कोई फर्क नहीं पड़ता।
  • इसलिए, परिणामी उपसमुच्चय प्राप्त करने के लिए, प्रारंभिक सरणी को पार करें। यह तय करते समय कि तत्व परिणामी उपसमुच्चय में होना चाहिए या नहीं, जांचें कि क्या k के बाइनरी प्रतिनिधित्व में कोई स्थिति है जो 0 है और उस तत्व में संबंधित स्थिति 1 है। यदि ऐसी स्थिति मौजूद है, तो उस तत्व को अनदेखा करें, अन्यथा इसे परिणामी उपसमुच्चय में शामिल करें।
  • यह कैसे निर्धारित करें कि k के बाइनरी प्रतिनिधित्व में कोई स्थिति है जो 0 है और एक तत्व में संबंधित स्थिति 1 है? बस k और उस तत्व का बिटवाइज़ OR लें। यदि यह k के बराबर नहीं है, तो ऐसी स्थिति मौजूद है और तत्व को अनदेखा करना होगा। यदि उनका बिटवाइज़ OR k के बराबर है, तो वर्तमान तत्व को परिणामी उपसमुच्चय में शामिल करें।
  • अंतिम चरण यह निर्धारित करना है कि क्या k में 1 की संबंधित स्थिति में कम से कम एक तत्व है जिसकी स्थिति में 1 है।
  • बस परिणामी उपसमुच्चय का बिटवाइज़ OR निकालें। यदि यह k के बराबर है, तो यह अंतिम उत्तर है। अन्यथा कोई उपसमुच्चय मौजूद नहीं है जो शर्त को पूरा करता हो।

उदाहरण

#include <bits/stdc++.h>
using namespace std;

void getSubSet(int *arr, int n, int k){
    vector<int> v;
    for (int i = 0; i < n; i++) {
        if ((arr[i] | k) == k)
            v.push_back(arr[i]);
    }
    int ans = 0;
    for (int i = 0; i < v.size(); i++) {
        ans |= v[i];
    }
    if (ans != k) {
        cout << "उपसमुच्चय मौजूद नहीं है" << endl;
        return;
    }
    cout << "परिणाम = ";
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    cout << endl;
}

int main(){
    int arr[] = { 1, 4, 2 };
    int k = 3;
    int n = sizeof(arr) / sizeof(arr[0]);
    getSubSet(arr, n, k);
    return 0;
}

आउटपुट

परिणाम = 1 2
  1. - C++ में दिए गए योग के साथ अधिकतम आकार का सबसेट

    समस्या कथनN तत्वों का एक एरे और योग दिया गया है। हमें उस अधिकतम आकार के सबसेट का आकार ढूंढना है जिसका योग दिए गए योग के बराबर हो।उदाहरणयदि इनपुट एरे arr = { 2, 3, 5, 10 } है और योग = 20 है तो आउटपुट 4 होगा क्योंकि −2 + 3 + 5 + 10 = 20 जो दिए गए योग के बराबर है।एल्गोरिदमहम इस समस्या को हल करने

  1. - C++ में N के चार गुणनखंड जिनका गुणनफल अधिकतम हो और योग N के बराबर हो

    मान लीजिए हमारे पास एक पूर्णांक N है। कार्य N के सभी गुणनखंड ढूंढना और N के चार गुणनखंडों का गुणनफल प्रदर्शित करना है, जैसे कि - उनके चार गुणनखंडों का योग N के बराबर हो चार गुणनखंडों का गुणनफल अधिकतम हो मान लीजिए संख्या 24 है, तो गुणनफल 1296 होगा। जैसा कि हम जानते हैं सभी गुणनखंड 1, 2, 3, 4, 6, 8,

  1. - C++ में LCM उत्पाद के बराबर होने वाले अधिकतम लंबाई के सबएरे

    मान लीजिए हमारे पास एक सरणी A है। हमें सबएरे की अधिकतम लंबाई ढूंढनी है, जिसका LCM उस सबएरे के एलिमेंट्स के उत्पाद के समान है। यदि ऐसा सबएरे नहीं मिलता, तो -1 वापस करें। मान लीजिए सरणी {6, 10, 21} है, तो लंबाई 2 है, क्योंकि सबएरे {10, 21} है, जिसका LCM 210 है, और उत्पाद भी 210 है। दृष्टिकोण सीधा है।