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

C++ में जोड़े हाथ पकड़ना (Couples Holding Hands) - न्यूनतम स्वैप


समस्या विवरण

N जोड़े (couples) हैं जो 2N सीटों पर एक पंक्ति में बैठे हैं और हाथ पकड़ना चाहते हैं। हमें न्यूनतम स्वैप (swaps) की संख्या ज्ञात करनी है ताकि हर जोड़ा अगल-बगल बैठ जाए।

लोग और सीटें 0 से 2N-1 तक संख्यांकित हैं। जोड़े क्रम में हैं: पहला जोड़ा (0, 1), दूसरा (2, 3), ..., अंतिम (2N-2, 2N-1)।

प्रारंभिक बैठने की व्यवस्था सरणी row द्वारा दी गई है जहां row[i] i-वीं सीट पर बैठे व्यक्ति का मान है।

उदाहरण

इनपुट

[0,2,4,1,3,5]

आउटपुट

2

समाधान दृष्टिकोण (यूनियन-फाइंड / डिस्जॉइंट सेट यूनियन)

प्रत्येक जोड़े को एक नोड मानें। वर्तमान बैठने में, प्रत्येक आसन्न सीट जोड़ी (row[2k], row[2k+1]) दो जोड़ों को जोड़ती है। उन्हें यूनियन-फाइंड में मर्ज करें। अंत में, आवश्यक स्वैप = N - जुड़े घटकों की संख्या।

कार्यकारी प्रोग्राम

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

class Solution {
public:
    class UF {
    public:
        vector<int> parent;
        int count;
        UF(int N) {
            count = N;
            parent = vector<int>(N);
            for (int i = 0; i < N; i++) parent[i] = i;
        }
        void unite(int a, int b) {
            int parA = find(a);
            int parB = find(b);
            if (parA == parB) return;
            count--;
            parent[parB] = parA;
        }
        int find(int i) {
            if (parent[i] == i) return i;
            return parent[i] = find(parent[i]);
        }
    };
    
    int minSwapsCouples(vector<int>& row) {
        int n = row.size();
        int N = n / 2;
        UF uf(N);
        for (int gr = 0; gr < N; gr++) {
            int a = row[gr * 2];
            int b = row[gr * 2 + 1];
            uf.unite(a / 2, b / 2);
        }
        return N - uf.count;
    }
};

int main() {
    Solution ob;
    vector<int> v = {0,2,4,1,3,5};
    cout << ob.minSwapsCouples(v);
    return 0;
}

आउटपुट

2
  1. C++ में प्रोसेस मारें C++ में प्रोसेस मारें

    मान लीजिए हमारे पास n प्रोसेस हैं, यहां प्रत्येक प्रोसेस की एक अद्वितीय आईडी होती है जिसे PID या प्रोसेस आईडी कहा जाता है और इसका PPID (पैरेंट प्रोसेस आईडी) भी होता है। प्रत्येक प्रोसेस का केवल एक पैरेंट प्रोसेस होता है, लेकिन उसके एक या अधिक चाइल्ड प्रोसेस हो सकते हैं। यह एक ट्री संरचना की तरह है।

  1. C++ में गिलहरी सिमुलेशन C++ में गिलहरी सिमुलेशन

    एक पेड़, एक गिलहरी, और कई नट्स हैं। स्थितियों को 2D ग्रिड में सेल द्वारा दर्शाया जाता है। आपका लक्ष्य गिलहरी के लिए सभी नट्स को इकट्ठा करके उन्हें एक-एक करके पेड़ के नीचे रखने के लिए न्यूनतम दूरी ढूंढना है। गिलहरी एक समय में अधिकतम एक नट ले जा सकती है और चार दिशाओं में आगे बढ़ सकती है - ऊपर, नीचे,

  1. C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल

    समस्या विवरण हमें अक्ष-संरेखित (axis-aligned) आयतों की एक सूची दी गई है। प्रत्येक आयत rectangle[i] = {x1, y1, x2, y2} द्वारा दर्शाया गया है, जहां (x1, y1) निचले-बाएं कोने का बिंदु है और (x2, y2) ऊपरी-दाएं कोने का बिंदु है। हमें तल (plane) में सभी आयतों द्वारा कवर किए गए कुल क्षेत्रफल को ज्ञात करना