82 lines
1.6 KiB
C++
82 lines
1.6 KiB
C++
|
#include <iostream>
|
||
|
#include <vector>
|
||
|
#include <algorithm>
|
||
|
|
||
|
/*
|
||
|
collectors:
|
||
|
{
|
||
|
a: 10,
|
||
|
b: 25,
|
||
|
c: 50,
|
||
|
d: 100
|
||
|
}
|
||
|
|
||
|
after selling kidney: 49
|
||
|
|
||
|
so it's:
|
||
|
1. 49 - 10 = 39
|
||
|
2. 39 - 25 = 14
|
||
|
3. 14 - 50 ??? NO. its just = (14 / remaining which is 2) = 7
|
||
|
4. also just 7
|
||
|
*/
|
||
|
|
||
|
struct Collector
|
||
|
{
|
||
|
int money = 0;
|
||
|
std::string name;
|
||
|
|
||
|
bool operator<(const Collector &collector) const
|
||
|
{
|
||
|
return money < collector.money;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
std::vector<Collector> calculatePayments(std::vector<Collector> debts, int budget)
|
||
|
{
|
||
|
int remaining_budget = budget;
|
||
|
int remaining_collectors = debts.size();
|
||
|
std::vector<Collector> payments;
|
||
|
|
||
|
if (budget < remaining_collectors)
|
||
|
{
|
||
|
return payments;
|
||
|
}
|
||
|
|
||
|
std::sort(debts.begin(), debts.end());
|
||
|
payments.reserve(remaining_collectors);
|
||
|
|
||
|
for (const auto& debt_record : debts)
|
||
|
{
|
||
|
const auto& debt_amount = debt_record.money;
|
||
|
const auto& debt_collector = debt_record.name;
|
||
|
const int even_distribution = remaining_budget / remaining_collectors;
|
||
|
|
||
|
int spending = (even_distribution <= debt_amount)
|
||
|
? even_distribution
|
||
|
: debt_amount;
|
||
|
|
||
|
payments.push_back({spending, debt_collector});
|
||
|
remaining_budget -= spending;
|
||
|
--remaining_collectors;
|
||
|
}
|
||
|
|
||
|
return payments;
|
||
|
}
|
||
|
|
||
|
int main()
|
||
|
{
|
||
|
const std::vector<Collector> debts =
|
||
|
{
|
||
|
{ 100, "Suika" },
|
||
|
{ 250, "Remilia" },
|
||
|
{ 1, "Reimu" },
|
||
|
{ 20, "Sakuya" }
|
||
|
};
|
||
|
|
||
|
const int budget = 67;
|
||
|
|
||
|
for (const auto& payment : calculatePayments(debts, budget))
|
||
|
{
|
||
|
std::cout << payment.name << ": " << payment.money << '\n';
|
||
|
}
|
||
|
}
|