Алгоритм, чтобы совместно использовать/уладить расходы среди группы

@HostListener('window:keydown', ['$event'])
  keyEvent(event: KeyboardEvent) {

   if (event.ctrlKey && event.keyCode == 82)
    {

    }
  }
14
задан Deduplicator 5 July 2014 в 22:27
поделиться

3 ответа

Вы это уже описали. Просуммируйте все расходы (1500 в вашем случае), разделите на количество людей, разделяющих расходы (500). Для каждого физического лица вычтите взносы, сделанные этим лицом из индивидуальной доли (для лица A вычтите 400 из 500). В результате получается чистая сумма, которую человек «должен» центральному пулу. Если число отрицательное для любого человека, центральный пул «должен» этому человеку.

Поскольку вы уже описали решение, я не знаю, о чем вы спрашиваете. Может быть, вы пытаетесь решить проблему без центрального пула, «банка»?

Я также не понимаю, что вы подразумеваете под «начинать с наименьшей потраченной суммы и двигаться вперед».

4
ответ дан 1 December 2019 в 12:27
поделиться

Лучший способ вернуться в нулевое состояние (минимальное количество транзакций) описан в этом вопросе здесь .

10
ответ дан 1 December 2019 в 12:27
поделиться

Все просто, как в тексте:

Возвращает расходы, которые должны быть оплачены всеми в исходном массиве. Негативные ценности: этот человек получает немного назад

Просто передайте все, что вы должны следующему в очереди, а затем бросьте учебу. Если получится, дождитесь второго раунда. Когда закончите, все переверните. После этих двух раундов все заплатили одинаковую сумму.

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;  
0
ответ дан 1 December 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: