#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
#include <tuple>
using namespace std;
struct Transaction {
string from;
string to;
int amount;
};
// Greedy Settlement Approach
vector<tuple<string, string, int>> settleBalances(const vector<Transaction>& transactions) {
unordered_map<string, int> balance;
// Step 1: Compute net balances
for (const auto& tx : transactions) {
balance[tx.from] -= tx.amount; // Payer loses money
balance[tx.to] += tx.amount; // Receiver gains money
}
// Step 2: Create lists of debtors and creditors
vector<pair<string, int>> debtors, creditors;
for (const auto& [person, bal] : balance) {
if (bal < 0) {
debtors.emplace_back(person, bal); // owes money
} else if (bal > 0) {
creditors.emplace_back(person, bal); // is owed money
}
}
// Step 3: Match debtors to creditors
vector<tuple<string, string, int>> result;
int i = 0, j = 0;
while (i < debtors.size() && j < creditors.size()) {
int amount = min(-debtors[i].second, creditors[j].second);
result.emplace_back(debtors[i].first, creditors[j].first, amount);
debtors[i].second += amount;
creditors[j].second -= amount;
if (debtors[i].second == 0) ++i;
if (creditors[j].second == 0) ++j;
}
return result;
}
int main() {
vector<Transaction> txns = {
{"A", "B", 10},
{"B", "C", 5},
{"C", "A", 5}
};
auto result = settleBalances(txns);
for (const auto& [from, to, amount] : result) {
cout << from << " pays " << to << " ₹" << amount << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHR1cGxlPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBUcmFuc2FjdGlvbiB7CiAgICBzdHJpbmcgZnJvbTsKICAgIHN0cmluZyB0bzsKICAgIGludCBhbW91bnQ7Cn07CgovLyBHcmVlZHkgU2V0dGxlbWVudCBBcHByb2FjaAp2ZWN0b3I8dHVwbGU8c3RyaW5nLCBzdHJpbmcsIGludD4+IHNldHRsZUJhbGFuY2VzKGNvbnN0IHZlY3RvcjxUcmFuc2FjdGlvbj4mIHRyYW5zYWN0aW9ucykgewogICAgdW5vcmRlcmVkX21hcDxzdHJpbmcsIGludD4gYmFsYW5jZTsKCiAgICAvLyBTdGVwIDE6IENvbXB1dGUgbmV0IGJhbGFuY2VzCiAgICBmb3IgKGNvbnN0IGF1dG8mIHR4IDogdHJhbnNhY3Rpb25zKSB7CiAgICAgICAgYmFsYW5jZVt0eC5mcm9tXSAtPSB0eC5hbW91bnQ7ICAvLyBQYXllciBsb3NlcyBtb25leQogICAgICAgIGJhbGFuY2VbdHgudG9dICs9IHR4LmFtb3VudDsgICAgLy8gUmVjZWl2ZXIgZ2FpbnMgbW9uZXkKICAgIH0KCiAgICAvLyBTdGVwIDI6IENyZWF0ZSBsaXN0cyBvZiBkZWJ0b3JzIGFuZCBjcmVkaXRvcnMKICAgIHZlY3RvcjxwYWlyPHN0cmluZywgaW50Pj4gZGVidG9ycywgY3JlZGl0b3JzOwogICAgZm9yIChjb25zdCBhdXRvJiBbcGVyc29uLCBiYWxdIDogYmFsYW5jZSkgewogICAgICAgIGlmIChiYWwgPCAwKSB7CiAgICAgICAgICAgIGRlYnRvcnMuZW1wbGFjZV9iYWNrKHBlcnNvbiwgYmFsKTsgIC8vIG93ZXMgbW9uZXkKICAgICAgICB9IGVsc2UgaWYgKGJhbCA+IDApIHsKICAgICAgICAgICAgY3JlZGl0b3JzLmVtcGxhY2VfYmFjayhwZXJzb24sIGJhbCk7ICAvLyBpcyBvd2VkIG1vbmV5CiAgICAgICAgfQogICAgfQoKICAgIC8vIFN0ZXAgMzogTWF0Y2ggZGVidG9ycyB0byBjcmVkaXRvcnMKICAgIHZlY3Rvcjx0dXBsZTxzdHJpbmcsIHN0cmluZywgaW50Pj4gcmVzdWx0OwogICAgaW50IGkgPSAwLCBqID0gMDsKCiAgICB3aGlsZSAoaSA8IGRlYnRvcnMuc2l6ZSgpICYmIGogPCBjcmVkaXRvcnMuc2l6ZSgpKSB7CiAgICAgICAgaW50IGFtb3VudCA9IG1pbigtZGVidG9yc1tpXS5zZWNvbmQsIGNyZWRpdG9yc1tqXS5zZWNvbmQpOwoKICAgICAgICByZXN1bHQuZW1wbGFjZV9iYWNrKGRlYnRvcnNbaV0uZmlyc3QsIGNyZWRpdG9yc1tqXS5maXJzdCwgYW1vdW50KTsKCiAgICAgICAgZGVidG9yc1tpXS5zZWNvbmQgKz0gYW1vdW50OwogICAgICAgIGNyZWRpdG9yc1tqXS5zZWNvbmQgLT0gYW1vdW50OwoKICAgICAgICBpZiAoZGVidG9yc1tpXS5zZWNvbmQgPT0gMCkgKytpOwogICAgICAgIGlmIChjcmVkaXRvcnNbal0uc2Vjb25kID09IDApICsrajsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0Owp9CmludCBtYWluKCkgewogICAgdmVjdG9yPFRyYW5zYWN0aW9uPiB0eG5zID0gewogICAgICAgIHsiQSIsICJCIiwgMTB9LAogICAgICAgIHsiQiIsICJDIiwgNX0sCiAgICAgICAgeyJDIiwgIkEiLCA1fQogICAgfTsKCiAgICBhdXRvIHJlc3VsdCA9IHNldHRsZUJhbGFuY2VzKHR4bnMpOwoKICAgIGZvciAoY29uc3QgYXV0byYgW2Zyb20sIHRvLCBhbW91bnRdIDogcmVzdWx0KSB7CiAgICAgICAgY291dCA8PCBmcm9tIDw8ICIgcGF5cyAiIDw8IHRvIDw8ICIg4oK5IiA8PCBhbW91bnQgPDwgZW5kbDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQo=