|
|
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Помогите придумать алгоритм, может быть есть какая-то "умная" формула! Есть такая задача, существует какое то кол-во N групп, у каждой группы есть стоимость (в моем случае группы - это разные программы страхования, где на каждой есть какая-то сумма денег). Необходимо уменьшить сумму этих групп на число S. Причем уменьшить равномерно, вычитая из из каждой примерно одинаковое число. Но в минус уходить нельзя. Например, p1 - 0 руб. p2- 40 руб. p3- 100 руб P4- 5 руб. Надо вычесть 60 рублей. т.е. в итоге должно быть p1 - 0 руб. p2- 12,5 руб. p3- 72,5 руб P4- 0 руб. Вычитать по 1 копейке с каждой пока не получится уменьшить на нужную сумму - слишком долгий алгоритм. Может можно как-то проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 17:37 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
31.10.2018 17:37, Кареглазая_зая пишет: > слишком долгий алгоритм. компьютер железный. ему пофиг. работает - не трожь! Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 17:47 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
Кареглазая_зая Необходимо уменьшить сумму этих групп на число S. Причем уменьшить равномерно, вычитая из из каждой примерно одинаковое число. Но в минус уходить нельзя. ... Вычитать по 1 копейке с каждой пока не получится уменьшить на нужную сумму - слишком долгий алгоритм. Может можно как-то проще? S:=ФормулаРасчета_S for i:=low(МаcсивP) to High(МаcсивP) do begin МаcсивP[i]:=МаcсивP[i]-S; if МаcсивP[i]<0 then МаcсивP[i]:=0; end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 17:50 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
Кареглазая_заяМожет можно как-то проще? Можно: вычитать по (оставшаяся сумма скидки/количество оставшихся групп) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 17:51 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
Кареглазая_зая> Необходимо уменьшить сумму этих групп на число S. Кареглазая_зая> Причем уменьшить равномерно, вычитая из из каждой Кареглазая_зая> примерно одинаковое число. Стандартный алгоритм веса объекта в группе (соотв. уменьшать по удельному весу). Кареглазая_зая> т.е. в итоге должно быть > > p1 - 0 руб. > p2- 12,5 руб. > p3- 72,5 руб > P4- 0 руб. По какому алгоритму получен данный ответ? Это - не "равномерно". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 18:04 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
Алгоритм примерно такой - вычислить сумму всех элементов, а затем пропорционально разделить между элементами с суммой > 0 Например, p1 - 0 руб. p2- 40 руб. p3- 100 руб P4- 5 руб. Сумма = 145 p1 - 0 руб. p2- 40 - 40 * 60 / 145 p3- 100 - 100 * 60 / 145 P4- 5 - 5 * 60 / 145 Единственная небольшая проблемка будет красиво раскидать дробные части копеек, чтобы получилось ровно 60 рублей. Поскольку подозреваю, что дробные числа меньше копейки тебя не интересуют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 18:23 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
Кареглазая_заявычитая из из каждой примерно одинаковое число 1. Делим число на количество ненулевых групп 2. Вычитаем из каждой группы полученное среднее 3. Если в группе меньше, чем нужно, вычитаем в 0, а невучтенный остаток запоминаем 4. Складываем все остатки и переходим к шагу 1 Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 19:12 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Все дробные числа переводим в целые, путем умножения на 100 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 19:13 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Спасибо большое. То что нужно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2018, 09:59 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
Кареглазая_зая, как вариант, чтобы делать меньше вычитаний, на промежуточных проходах цикла (когда есть элементы ниже среднего) можно не трогать те, которые выше среднего ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2018, 10:22 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
Кареглазая_зая, в принципе, все вычитания можно сделать за один последний проход по массиву: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. особо не отлаживал, проверял работу этим: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2018, 11:55 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=91&tid=2040183]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
34ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 287ms |

| 0 / 0 |
