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

बिटवाइज़ के साथ अधिकतम उपसमुच्चय या C++ में k के बराबर

समस्या कथन

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

उदाहरण

If given input array is = [1, 4, 2] and k = 3 then output is:
[1, 2]
The bitwise OR of 1 and 2 equals 3. It is not possible to obtain
a subset of length greater than 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 का और वह तत्व लें। यदि यह k के बराबर नहीं है, तो ऐसी स्थिति होती है और तत्व को अनदेखा करना पड़ता है। यदि उनका बिटवाइज़ या k के बराबर है, तो परिणामी उपसमुच्चय में वर्तमान तत्व शामिल करें।

  • अंतिम चरण यह निर्धारित करना है कि k में संबंधित स्थिति में 1 के साथ 1 के साथ कम से कम एक तत्व है या नहीं।

  • बस बिटवाइज़ या परिणामी सबसेट की गणना करें। यदि यह 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 << "Subset does not exist" << endl;
      return;
   }
   cout << "Result = ";
   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;
}

आउटपुट

जब आप उपरोक्त प्रोग्राम को संकलित और निष्पादित करते हैं। यह निम्नलिखित आउटपुट उत्पन्न करता है -

Result = 1 2

  1. C++ में दिए गए योग के साथ अधिकतम आकार का उपसमुच्चय

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

  1. अधिकतम उत्पाद के साथ एन के चार कारक खोजें और सी ++ में एन के बराबर योग करें

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

  1. सी ++ में उत्पाद के बराबर एलसीएम के साथ अधिकतम लंबाई उपसरणी

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