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

गेहूँ बेचकर अधिकतम लाभ प्राप्त करने का C++ प्रोग्राम


मान लीजिए n शहर हैं जो m एकदिश सड़कों से जुड़े हैं। सड़कें केवल स्रोत से गंतव्य की ओर जाती हैं। सड़कों को 'roads' सरणी में {स्रोत, गंतव्य} प्रारूप में दिया गया है। प्रत्येक शहर में गेहूँ का मूल्य अलग-अलग है, जो 'price' सरणी में दिया गया है जहाँ i-वाँ मान i-वें शहर में गेहूँ का मूल्य दर्शाता है। एक यात्री किसी भी शहर से गेहूँ खरीदकर किसी भी पहुँच योग्य शहर में बेच सकता है। हमें यात्री द्वारा गेहूँ का व्यापार करके प्राप्त किए जा सकने वाले अधिकतम लाभ की गणना करनी है।

उदाहरण के लिए, यदि इनपुट है n = 5, m = 3, price = {4, 6, 7, 8, 5}, roads = {{1, 2}, {2, 3}, {2, 4}, {4, 5}}, तो आउटपुट 4 होगा।

यदि यात्री पहले शहर में गेहूँ खरीदकर चौथे शहर में बेचता है, तो कुल लाभ 4 होगा।

चरण

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

आकार n×n का एक 2D सरणी graph परिभाषित करें
i := 0 से प्रारंभ करें, जब i < m, i को 1 से बढ़ाते हुए:
    x := roads[i] का पहला मान
    y := roads[i] का दूसरा मान
    x, y को 1 घटाएँ
    y को graph[x] के अंत में डालें
आकार n का एक सरणी tp परिभाषित करें जिसे ऋणात्मक अनंत से आरंभ किया गया हो
i := 0 से प्रारंभ करें, जब i < n, i को 1 से बढ़ाते हुए:
    graph[i] में प्रत्येक मान u के लिए:
        tp[u] := min({tp[u], tp[i], price[i]}) का न्यूनतम
res := ऋणात्मक अनंत
i := 0 से प्रारंभ करें, जब i < n, i को 1 से बढ़ाते हुए:
    res := max(res, price[i] - tp[i])
res लौटाएँ

उदाहरण

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

#include <bits/stdc++.h> using namespace std; int solve(int n, int m, vector<int> price, vector<pair<int, int>> roads){    vector<vector<int>> graph(n);    for(int i = 0; i < m; i++){       int x, y;       x = roads[i].first;       y = roads[i].second;       x--, y--;       graph[x].push_back(y);    }    vector<int> tp(n, int(INFINITY));    for(int i = 0; i < n; i++){       for(int u : graph[i]){          tp[u] = min({tp[u], tp[i], price[i]});       }    }    int res = -int(INFINITY);    for(int i = 0; i < n; i++){       res = max(res, price[i] - tp[i]);    }    return res; } int main() {    int n = 5, m = 3;    vector <int> price = {4, 6, 7, 8, 5};    vector<pair<int, int>> roads = {{1, 2}, {2, 3}, {2, 4}, {4, 5}}; cout<< solve(n, m, price, roads); return 0; }

इनपुट

5, 3, {4, 6, 7, 8, 5}, {{1, 2}, {2, 3}, {2, 4}, {4, 5}}

आउटपुट

4
  1. - दिए गए मैट्रिक्स से पैलिंड्रोमिक मैट्रिक्स बनाया जा सकता है या नहीं जांचने के लिए C++ प्रोग्राम

    मान लीजिए, हमें h x w आयामों वाला एक मैट्रिक्स दिया गया है। मैट्रिक्स में अंग्रेजी अक्षर हैं। हमें एक और मैट्रिक्स बनाना है जिसमें पैलिंड्रोमिक पंक्तियां और कॉलम हों, यानी प्रत्येक पंक्ति और कॉलम पैलिंड्रोम होंगे। ऐसा करने के लिए, दिए गए मैट्रिक्स से पंक्तियों और कॉलम की कोई भी व्यवस्था की जा सकती ह

  1. ग्राफ में सुपर वर्टेक्स खोजने का C++ प्रोग्राम ग्राफ में सुपर वर्टेक्स खोजने का C++ प्रोग्राम

    मान लीजिए n वर्टेक्स वाला एक ग्राफ दिया गया है। वर्टेक्स 1 से n तक संख्याबद्ध हैं और edges सरणी में दी गई एज्स से जुड़े हैं। प्रत्येक वर्टेक्स का एक x मान है जो 1 से n के बीच होता है, यह values सरणी में दिया गया है। हमें ग्राफ में सुपर वर्टेक्स खोजने हैं। एक वर्टेक्स i को सुपर वर्टेक्स कहा जाता है

  1. ग्राफ से घटाए जा सकने वाले अधिकतम स्कोर की मात्रा ज्ञात करने का C++ प्रोग्राम ग्राफ से घटाए जा सकने वाले अधिकतम स्कोर की मात्रा ज्ञात करने का C++ प्रोग्राम

    मान लीजिए n वर्टेक्स और m एज वाला एक भारित, निदेश रहित ग्राफ दिया गया है। ग्राफ का स्कोर ग्राफ में सभी एज भारों का योग है। एज भार ऋणात्मक हो सकते हैं, और यदि उन्हें हटा दिया जाए तो ग्राफ का स्कोर बढ़ जाता है। हमें ग्राफ को संबद्ध रखते हुए एज हटाकर ग्राफ के स्कोर को न्यूनतम करना है। हमें घटाए जा सकन