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

C++ में एक आयत को दूसरे में डालने के बाद बचे न्यूनतम आयतों की संख्या खोजें


मान लीजिए हमारे पास N अलग-अलग आयतों की चौड़ाई और ऊंचाई है; हमें एक आयत को दूसरे में डालने के बाद बचे न्यूनतम आयतों की संख्या खोजनी है। यदि W1 और W2 आयतों R1 और R2 की चौड़ाई हैं। और H1 और H2 R1 और R2 की ऊंचाई हैं, तो यदि W1 < W2 और H1 < H2 तो आयत R1, आयत R2 के अंदर फिट हो जाता है। इस प्रकार, सबसे छोटा दूसरे सबसे छोटे में फिट हो सकता है, फिर वह अगले में फिट होता है, और इसी तरह।

उदाहरण के लिए, यदि इनपुट {{30, 45}, {15, 15}, {45, 30}, {60, 75}} है, तो आउटपुट 2 होगा क्योंकि संभावित तरीकों में से एक है दूसरे आयत को पहले में डालें और फिर उस आयत को चौथे में डालें। तीसरा और चौथा आयत बचे रहेंगे।

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

  • n := बॉक्सेस का आकार
  • बॉक्सेस ऐरे को उनके आकार के आधार पर सॉर्ट करें
  • नेस्टेड नामक पेयर्स का एक ऐरे परिभाषित करें
  • बॉक्सेस[n - 1] को नेस्टेड के अंत में डालें
  • i := n - 2 से 0 तक घटते हुए लूप करें:
    • राइट := नेस्टेड का आकार
    • जब तक लेफ्ट <= राइट:
      • मिड := (राइट + लेफ्ट) / 2
      • यदि नेस्टेड[मिड] की ऊंचाई बॉक्सेस[i] की ऊंचाई के बराबर है या नेस्टेड[मिड] की चौड़ाई <= बॉक्सेस[i] की चौड़ाई, तो लेफ्ट := मिड + 1
      • अन्यथा राइट := मिड - 1
    • यदि लेफ्ट नेस्टेड के आकार के बराबर है, तो बॉक्सेस[i] को नेस्टेड के अंत में डालें
    • अन्यथा नेस्टेड[लेफ्ट] की चौड़ाई और ऊंचाई को बॉक्सेस[i] के बराबर करें
  • नेस्टेड का आकार लौटाएं

उदाहरण

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

#include <bits/stdc++.h> using namespace std; bool comp(const pair<int, int>& L, const pair<int, int>& R) { if (L.first == R.first) return L.second > R.second; return L.first < R.first; } int Rectangles(vector<pair<int, int>> &boxes) { int n = boxes.size(); sort(boxes.begin(), boxes.end(), comp); vector<pair<int, int> > nested; nested.push_back(boxes[n - 1]); for (int i = n - 2; i >= 0; --i) { int right = nested.size() - 1, left = 0; while (left <= right) { int mid = (right + left) / 2; if (nested[mid].first == boxes[i].first || nested[mid].second <= boxes[i].second) left = mid + 1; else right = mid - 1; } if (left == nested.size()) nested.push_back(boxes[i]); else { nested[left].second = boxes[i].second; nested[left].first = boxes[i].first; } } return nested.size(); } int main() { vector<pair<int, int>> boxes = {{30, 45}, {15,15}, {45,30},{60,75}}; cout << Rectangles(boxes); }

इनपुट

{{30, 45}, {15,15}, {45,30},{60,75}}

आउटपुट

2

  1. - C++ में एक स्ट्रिंग को दूसरी में बदलने के लिए न्यूनतम विलोपन और सम्मिलन

    विवरण आकार m और n की दो स्ट्रिंग्स str1 और str2 दी गई हैं। str1 से न्यूनतम वर्णों को हटाने और सम्मिलित करने का कार्य है ताकि इसे str2 में बदला जा सके। Str1 = tutorialspoint Str2 = tutorials str1 को str2 में बदलने के लिए हमें str1 से पांच वर्ण यानी point हटाने होंगे। एल्गोरिदम 1. str1 और str2 का सबस

  1. - C++ में सरणी में एक संख्या की फ्रीक्वेंसी ज्ञात करना

    मान लीजिए हमारे पास एक सरणी है। इसमें n अलग-अलग तत्व हैं। हमें सरणी में एक तत्व की फ्रीक्वेंसी जांचनी है। मान लीजिए A = [5, 12, 26, 5, 3, 4, 15, 5, 8, 4], यदि हम 5 की फ्रीक्वेंसी ढूंढने की कोशिश करते हैं, तो यह 3 होगी। इसे हल करने के लिए, हम सरणी को बाएं से स्कैन करेंगे, यदि तत्व दी गई संख्या के सम

  1. - C++ प्रोग्राम ग्राफ को डिस्कनेक्ट करने के लिए काटने के लिए न्यूनतम एजेस की संख्या खोजने के लिए

    इस प्रोग्राम में हमें एक ग्राफ की एज कनेक्टिविटी ढूंढनी है। एक ग्राफ की एज कनेक्टिविटी का अर्थ है यह एक ब्रिज है, इसे हटाने पर ग्राफ डिस्कनेक्ट हो जाएगा। एक डिस्कनेक्टेड अनडायरेक्टेड ग्राफ में ब्रिज को हटाने पर कनेक्टेड कंपोनेंट्स की संख्या बढ़ जाती है। फंक्शन्स और सूडोकोड connections() एक रिकर्सि