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

सी++ में इष्टतम खाता संतुलन


मान लीजिए कि दोस्तों का एक समूह छुट्टी पर गया था और कभी-कभी वे एक-दूसरे को पैसे उधार देते थे। उदाहरण के तौर पर, अमित ने बिक्रम के लंच के लिए $10 का भुगतान किया। फिर बाद में चंदन ने अमित को टैक्सी के किराए के लिए 5 डॉलर दिए। हमें एक मॉडल डिजाइन करना होगा जहां प्रत्येक लेनदेन को टपल (x, y, z) के रूप में लिया जाता है, जिसका अर्थ है कि व्यक्ति x ने व्यक्ति को y $z दिया है।

मान लें कि अमित, बिक्रम और चंदन क्रमशः व्यक्ति 0, 1 और 2 हैं, लेन-देन को [[0, 1, 10], [2, 0, 5]] के रूप में दर्शाया जा सकता है। यदि हमारे पास लोगों के समूह के बीच लेन-देन की एक सूची है, तो हमें ऋण को निपटाने के लिए आवश्यक न्यूनतम लेनदेन की संख्या ज्ञात करनी होगी।

इसलिए, यदि इनपुट [[0,1,10], [2,0,5]] जैसा है, तो आउटपुट 2 होगा, क्योंकि व्यक्ति #0 ने व्यक्ति को #1 $10 दिया है। फिर व्यक्ति #2 ने व्यक्ति को #0 $5 दिया। यहां दो लेनदेन की जरूरत है। कर्ज को निपटाने का एक तरीका है व्यक्ति #1 भुगतान करने वाले व्यक्ति #0 और #2 $5 प्रत्येक।

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

  • सरणी को परिभाषित करें v

  • फ़ंक्शन dfs() को परिभाषित करें, यह idx लेगा,

  • रिट :=inf

  • जबकि (idx

    • (आईडीएक्स को 1 से बढ़ाएं)

  • इनिशियलाइज़ करने के लिए i :=idx + 1, जब i − v का आकार, अपडेट (i 1 से बढ़ाएँ), करें −

    • अगर v[i] * v[idx] <0, तो -

      • v[i] :=v[i] + v[idx]

      • ret :=न्यूनतम रिट और 1 + dfs(idx + 1)

      • v[i] :=v[i] - v[idx]

  • वापसी (यदि रिट inf के समान है, तो 0, अन्यथा रिट)

  • मुख्य विधि से निम्न कार्य करें -

  • एक नक्शा परिभाषित करें मी

  • n :=t का आकार

  • इनिशियलाइज़ i :=0 के लिए, जब i

    • यू:=टी[i, 0], वी:=टी[i, 1]

    • बाल:=टी[i, 2]

    • एम[यू] :=एम[यू] + बाल

    • एम[वी] :=एम[वी] - बाल

  • m में प्रत्येक कुंजी-मान युग्म i के लिए, −

    . करें
    • यदि i का मान है, तो -

      • v के अंत में i का मान डालें

    • (मैं 1 से बढ़ाइए)

  • कम से कम dfs (0) और v का आकार लौटाएं

उदाहरण

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   vector<int> v;
   int dfs(int idx) {
      int ret = INT_MAX;
      while (idx < v.size() && !v[idx])
         idx++;
      for (int i = idx + 1; i < v.size(); i++) {
         if (v[i] * v[idx] < 0) {
            v[i] += v[idx];
            ret = min(ret, 1 + dfs(idx + 1));
            v[i] -= v[idx];
         }
      }
      return ret == INT_MAX ? 0 : ret;
   }
   int minTransfers(vector<vector<int>>&t) {
      map<int, int> m;
      int n = t.size();
      for (int i = 0; i < n; i++) {
         int u = t[i][0];
         int v = t[i][1];
         int bal = t[i][2];
         m[u] += bal;
         m[v] -= bal;
      }
      map<int, int>::iterator i = m.begin();
      while (i != m.end()) {
         if (i->second)
            v.push_back(i->second);
         i++;
      }
      return min(dfs(0), (int)v.size());
   }
};
main() {
   Solution ob;
   vector<vector<int>> v = {{0,1,10},{2,0,5}};
   cout << (ob.minTransfers(v));
}

इनपुट

{{0,1,10},{2,0,5}}

आउटपुट

2

  1. C++ . में विकर्ण ट्रैवर्स II

    मान लीजिए कि हमारे पास nums नामक सूचियों की एक सूची है, हमें अंकों के सभी तत्वों को विकर्ण क्रम में दिखाना होगा। तो, अगर इनपुट पसंद है तो आउटपुट [1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16] होगा इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - एक सरणी रिट परिभाषित करें एक 2डी सरणी को परिभाषित

  1. सी ++ में प्रक्रिया को मारें

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

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

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