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

C++ में Qवें व्यक्ति के लिए छड़ की अधिकतम लंबाई


समस्या कथन

एक ऐरे में n छड़ों की लंबाई दी गई है। यदि कोई व्यक्ति कोई छड़ चुनता है, तो सबसे लंबी छड़ का आधा भाग (या (max + 1) / 2) असाइन किया जाता है और शेष भाग (max - 1) / 2 वापस रख दिया जाता है। यह मान लिया जा सकता है कि पर्याप्त संख्या में छड़ें हमेशा उपलब्ध हैं, M क्वेरी का उत्तर दें जो एक ऐरे q[] में दी गई हैं ताकि qवें व्यक्ति के लिए उपलब्ध सबसे बड़ी छड़ की लंबाई ढूंढी जा सके, बशर्ते qi 1 से शुरू होने वाली एक वैध व्यक्ति संख्या हो।

उदाहरण

इनपुट: a[] = {6, 5, 9, 10, 12}   q[] = {1, 3} 
आउटपुट: 12 9 
पहला व्यक्ति अधिकतम लंबाई 12 प्राप्त करता है। हम ऐरे से 12 हटाते हैं और (12 - 1) / 2 = 5 वापस रखते हैं। 
दूसरा व्यक्ति अधिकतम लंबाई 10 प्राप्त करता है। हम (10 - 1)/2 वापस रखते हैं जो 4 है। 
तीसरा व्यक्ति अधिकतम लंबाई 9 प्राप्त करता है।

यदि इनपुट ऐरे {6, 5, 9, 10, 12} है और

क्वेरी ऐरे {1, 3} है तो आउटपुट 12 और 9 होगा -

  • पहला व्यक्ति अधिकतम लंबाई वाली छड़ प्राप्त करता है यानी 12
  • फिर हम ऐरे से 12 हटाते हैं और (12 - 1) / 2 = 5 वापस रखते हैं
  • दूसरा व्यक्ति अधिकतम लंबाई वाली छड़ प्राप्त करता है यानी 10
  • फिर हम (10 - 1) / 2 = 4 वापस रखते हैं
  • तीसरा व्यक्ति अधिकतम लंबाई वाली छड़ प्राप्त करता है यानी 9

एल्गोरिदम

  • सभी लंबाई को सॉर्ट करें और उन्हें स्टैक पर पुश करें
  • स्टैक के शीर्ष तत्व को लें, और 2 से विभाजित करें और शेष लंबाई को कतार में पुश करें
  • यदि स्टैक खाली है, तो कतार के सामने को पॉप करें और वापस कतार में पुश करें। इसका आधा (front / 2), यदि शून्येतर है
  • यदि कतार खाली है, तो स्टैक से पॉप करें और कतार में पुश करें इसका आधा (top / 2), यदि शून्येतर है
  • यदि दोनों खाली नहीं हैं, तो शीर्ष और सामने की तुलना करें, जो भी बड़ा हो उसे पॉप करें, 2 से विभाजित करें और फिर वापस पुश करें
  • जब दोनों स्टैक और कतार खाली हो जाएं तो रुकें

उदाहरण

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

vector getMaxRodLength(int* arr, int n, int m) {
    queue q;
    sort(arr, arr + n);
    stack s;
    
    for (int i = 0; i < n; ++i) {
        s.push(arr[i]);
    }
    
    vector result;
    
    while (!s.empty() || !q.empty()) {
        int val;
        if (q.empty()) {
            val = s.top();
            result.push_back(val);
            s.pop();
            val = val / 2;
            if (val) {
                q.push(val);
            }
        } else if (s.empty()) {
            val = q.front();
            result.push_back(val);
            q.pop();
            val = val / 2;
            if (val != 0) {
                q.push(val);
            }
        } else {
            val = s.top();
            int fr = q.front();
            if (fr > val) {
                result.push_back(fr);
                q.pop();
                fr = fr / 2;
                if (fr) {
                    q.push(fr);
                }
            } else {
                result.push_back(val);
                s.pop();
                val = val / 2;
                if (val) {
                    q.push(val);
                }
            }
        }
    }
    
    return result;
}

int main() {
    int rods = 5;
    int queries = 10;
    int arr[rods] = {6, 5, 9, 10, 12};
    vector result = getMaxRodLength(arr, rods, queries);
    int query[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int n_query = sizeof(query) / sizeof(query[0]);
    cout << "Rod length = ";
    for (int i = 0; i < n_query; ++i) {
        cout << result[query[i] - 1] << " ";
    }
    cout << endl;
    return 0;
}

आउटपुट

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

Rod length = 12 10 9 6 6 5 5 4 3 3

  1. C++ में अधिकतम मोड़ों वाला पथ लंबाई C++ में अधिकतम मोड़ों वाला पथ लंबाई

    एक समस्या को हल करने के लिए जिसमें हमें एक बाइनरी ट्री दिया गया है। अब हमें अधिकतम संख्या में मोड़ों वाला पथ खोजने की आवश्यकता है। यानी, एक मोड़ तब माना जाता है जब पथ की दिशा बाएं से दाएं या इसके विपरीत बदलती है, उदाहरण के लिएइनपुट -आउटपुट -6अब इस दृष्टिकोण में, हम ट्री को पार करेंगे और पिछली गतिविध

  1. C++ में नोड और पूर्वज के बीच अधिकतम अंतर C++ में नोड और पूर्वज के बीच अधिकतम अंतर

    मान लीजिए हमारे पास एक बाइनरी ट्री की रूट है, हमें अधिकतम मान V ढूंढना होगा जिसके लिए अलग-अलग नोड्स A और B मौजूद हैं जहां V = |A का मान - B का मान| और A, B का पूर्वज है। इसलिए यदि ट्री इस तरह है: तो आउटपुट 7 होगा। पूर्वज नोड अंतर इस तरह हैं: [(8 - 3), (7 - 3), (8 - 1), (10-13)], उनमें से (8 - 1

  1. C++ में अधिकतम बाइनरी ट्री II C++ में अधिकतम बाइनरी ट्री II

    मान लीजिए हमारे पास एक अधिकतम ट्री का रूट नोड है: अधिकतम ट्री एक ट्री है जहां प्रत्येक नोड का मान उसके सबट्री में किसी भी अन्य मान से अधिक होता है। मान लीजिए हमारे पास construct() नामक एक विधि है। यह सूची A से एक रूट बना सकती है। construct() विधि इस तरह है: यदि सूची A खाली है, तो null लौटाएं। अन्य