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

C++ में हटाने के लिए सर्वोत्तम अंतराल ढूंढने का प्रोग्राम

समस्या विवरण

मान लीजिए हमारे पास संभावित रूप से ओवरलैपिंग अंतरालों (समावेशी) की एक सूची है। अब एक ऑपरेशन पर विचार करें जहां हम एक अंतराल हटाते हैं, फिर शेष अंतरालों को मर्ज करते हैं और फिर बचे हुए अंतरालों की संख्या गिनते हैं। हमें हटाने के बाद बचे हुए अंतरालों की अधिकतम संभव संख्या ढूंढनी है।

उदाहरण के लिए, यदि इनपुट है intervals = [[5, 8], [6, 7], [7, 10], [9, 11]], तो आउटपुट 2 होगा। ऐसा इसलिए क्योंकि:

  • यदि हम अंतराल [5, 8] हटाते हैं तो हमें मर्ज के रूप में [6, 11] मिलता है।
  • यदि हम अंतराल [6, 7] हटाते हैं तो हमें मर्ज के रूप में [5, 11] मिलता है।
  • यदि हम अंतराल [7, 10] हटाते हैं तो हमें मर्ज के रूप में [5, 8], [9, 11] मिलता है।
  • यदि हम अंतराल [9, 11] हटाते हैं तो हमें मर्ज के रूप में [5, 10] मिलता है।

तो [7, 10] को हटाना सही है।

हल करने का दृष्टिकोण

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

  1. संख्या जोड़ियों का एक ऐरे memo परिभाषित करें
  2. एक फंक्शन countIntervals() परिभाषित करें जो एक 2D ऐरे intervals, i, end लेता है
    • यदि i, intervals के आकार के बराबर है, तो 0 वापस करें
    • यदि memo[i].first < end, तो -अनंत वापस करें
    • यदि memo[i].first == end, तो memo[i].second वापस करें
    • यदि end < intervals[i][0]:
      • memo[i] := min(end, memo[i].first), 1 + countIntervals(intervals, i+1, intervals[i][1])
      • memo[i].second वापस करें
    • memo[i] := min(end, memo[i].first), countIntervals(intervals, i+1, max(intervals[i][1], end))
    • memo[i].second वापस करें
  3. मुख्य विधि से:
    • memo ऐरे को intervals के आकार तक रिसाइज करें
    • intervals ऐरे को सॉर्ट करें
    • count := 0, result := 0, end := -1
    • एक ऐरे temp परिभाषित करें
    • i := 0 से intervals के आकार तक:
      • result := max(result, count + countIntervals(intervals, i+1, end))
      • यदि end < intervals[i][0], तो count बढ़ाएं
      • end := max(end, intervals[i][1])
    • result वापस करें

उदाहरण

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

vector<pair<int, int>> memo;

int countIntervals(vector<vector<int>>& intervals, int i, int end) {
    if (i == intervals.size()) return 0;
    if (memo[i].first < end) return INT_MIN;
    if (memo[i].first == end) return memo[i].second;
    if (end < intervals[i][0]) {
        memo[i] = {min(end, memo[i].first), 1 + countIntervals(intervals, i + 1, intervals[i][1])};
        return memo[i].second;
    }
    memo[i] = {min(end, memo[i].first), countIntervals(intervals, i + 1, max(intervals[i][1], end))};
    return memo[i].second;
}

int solve(vector<vector<int>>& intervals) {
    memo.clear();
    memo.resize(intervals.size(), {INT_MAX, -1});
    sort(intervals.begin(), intervals.end());
    int count = 0, result = 0, end = -1;
    vector<int> temp;
    for (int i = 0; i < intervals.size(); i++) {
        result = max(result, count + countIntervals(intervals, i + 1, end));
        if (end < intervals[i][0]) count++;
        end = max(end, intervals[i][1]);
    }
    return result;
}

int main() {
    vector<vector<int>> v = {{5, 8}, {6, 7}, {7, 10}, {9, 11}};
    cout << solve(v);
}

इनपुट

{{5, 8}, {6, 7}, {7, 10}, {9, 11}}

आउटपुट

2
  1. C++ में रेखा का मध्य बिंदु खोजने का प्रोग्राम C++ में रेखा का मध्य बिंदु खोजने का प्रोग्राम

    इस समस्या में, हमें दो बिंदु A और B दिए गए हैं, एक रेखा के प्रारंभिक और अंतिम बिंदु। हमारा कार्य C++ में रेखा का मध्य बिंदु खोजने के लिए एक प्रोग्राम बनाना है। समस्या विवरण यहां, हमारे पास प्रारंभिक और अंतिम बिंदु A(x1, y1) और B(x2, y2) वाली एक रेखा है। और हमें रेखा का मध्य बिंदु ज्ञात करना है। उद

  1. C++ में त्रिभुज के केंद्रक (Centroid) ज्ञात करने का प्रोग्राम C++ में त्रिभुज के केंद्रक (Centroid) ज्ञात करने का प्रोग्राम

    इस समस्या में, हमें एक 2D ऐरे दिया गया है जो त्रिभुज के तीन शीर्षों के निर्देशांक को दर्शाता है। हमारा कार्य C++ में त्रिभुज के केंद्रक (Centroid) ज्ञात करने का प्रोग्राम बनाना है।केंद्रक (Centroid) त्रिभुज का वह बिंदु है जहां त्रिभुज की तीनों मध्यिकाएं (medians) प्रतिच्छेद करती हैं।मध्यिका (Median)

  1. C++ में समानांतर चतुर्भुज (Parallelogram) का क्षेत्रफल ज्ञात करने का प्रोग्राम C++ में समानांतर चतुर्भुज (Parallelogram) का क्षेत्रफल ज्ञात करने का प्रोग्राम

    इस समस्या में, हमें दो मान दिए गए हैं जो समानांतर चतुर्भुज के आधार (base) और ऊंचाई (height) को दर्शाते हैं। हमारा कार्य C++ में समानांतर चतुर्भुज (Parallelogram) का क्षेत्रफल ज्ञात करने का प्रोग्राम बनाना है।समानांतर चतुर्भुज (Parallelogram) चार भुजाओं वाली एक बंद आकृति है जिसकी विपरीत भुजाएं समान औ