@HostListener('window:keydown', ['$event'])
keyEvent(event: KeyboardEvent) {
if (event.ctrlKey && event.keyCode == 82)
{
}
}
Вы это уже описали. Просуммируйте все расходы (1500 в вашем случае), разделите на количество людей, разделяющих расходы (500). Для каждого физического лица вычтите взносы, сделанные этим лицом из индивидуальной доли (для лица A вычтите 400 из 500). В результате получается чистая сумма, которую человек «должен» центральному пулу. Если число отрицательное для любого человека, центральный пул «должен» этому человеку.
Поскольку вы уже описали решение, я не знаю, о чем вы спрашиваете. Может быть, вы пытаетесь решить проблему без центрального пула, «банка»?
Я также не понимаю, что вы подразумеваете под «начинать с наименьшей потраченной суммы и двигаться вперед».
Лучший способ вернуться в нулевое состояние (минимальное количество транзакций) описан в этом вопросе здесь .
Все просто, как в тексте:
Возвращает расходы, которые должны быть оплачены всеми в исходном массиве. Негативные ценности: этот человек получает немного назад
Просто передайте все, что вы должны следующему в очереди, а затем бросьте учебу. Если получится, дождитесь второго раунда. Когда закончите, все переверните. После этих двух раундов все заплатили одинаковую сумму.
procedure SettleDepth(Expenses: array of double);
var
i: Integer;
s: double;
begin
//Sum all amounts and divide by number of people
// O(n)
s := 0.0;
for i := Low(Expenses) to High(Expenses) do
s := s + Expenses[i];
s := s / (High(Expenses) - Low(Expenses));
// Inplace Change to owed amount
// and hand on what you owe
// drop out if your even
for i := High(Expenses) downto Low(Expenses)+1 do begin
Expenses[i] := s - Expenses[i];
if (Expenses[i] > 0) then begin
Expenses[i-1] := Expenses[i-1] + Expenses[i];
Expenses.Delete(i);
end else if (Expenses[i] = 0) then begin
Expenses.Delete(i);
end;
end;
Expenses[Low(Expenses)] := s - Expenses[Low(Expenses)];
if (Expenses[Low(Expenses)] = 0) then begin
Expenses.Delete(Low(Expenses));
end;
// hand on what you owe
for i := Low(Expenses) to High(Expenses)-1 do begin
if (Expenses[i] > 0) then begin
Expenses[i+1] := Expenses[i+1] + Expenses[i];
end;
end;
end;