Завдання
Припустимо, що pпеполу доведеться розділити рахунок; кожен з них ідентифікується трійкою, (Name, n, k)що складається з:
Name: назва ;n: сума, яку вона повинна сплатити ;k: сума, яку вона / він фактично сплатила .
Завдання тут полягає в тому, щоб з’ясувати, скільки хто кому зобов’язаний.
Припущення
Введення та вихід можуть бути у будь-якому зручному форматі.
pnkpІмена - це унікальні рядки довільної довжини, складені з малих символів алфавіту.
Рішення
Рішення представлено мінімальним набором транзакцій серед pлюдей; зокрема, це трійки(from, to, amount)
from:nameпро особу, яка дає гроші;to:nameпро особу, яка отримує гроші;amount: сума грошей угоди.
ПРИМІТКА : Сума всіх боргів ( n) може відрізнятися від суми всіх уже сплачених сум ( k). У цьому випадку потрібно додати у вихідному ('owner', Name, amount)чи (Name, 'owner', amount)у вибраному форматі. Будь-яке ім'я ніколи не буде owner. Рядок "Власник" є гнучким.
Якщо існує декілька мінімальних наборів, виберіть один із мінімальною сумою всіх сум транзакції (абсолютні значення); у разі краватки виберіть один із них.
Випробування:
inputs(Name,n,k):
[('a',30,40),('b',40,50),('c',30,15)]
[('a',30,30),('b',20,20)]
[('a',30,100),('b',30,2),('c',40,0)]
[('a',344,333),('b',344,200),('c',2,2)]
[('a',450,400),('b',300,300),('c',35,55)]
outputs(from, to, amount):
[('c','a',10),('c','b',5),('owner','b',5)] or [('c','b',10),('c','a',5),('owner','a',5)]
[]
[('owner','a',2),('b','a',28),('c','a',40)] PS: [('owner','a',2),('b','a',68),('c','b',40)] has the same number of transactions, but it is not a valid answer, because the total amount of its transaction is greater than that of the proposed solution.
[('a','owner',11),('b','owner',144)]
[('a','owner',30),('a','c',20)]
Це код-гольф: виграє найкоротший код .