Задать вопрос
@nyatmeat15

Разложить количество чеков по дням, алгоритм?

Здравствуйте, возможно задача глупая, но возник вопрос.
Есть суммарное количество чеков, например 800, и неделя.
С понедельника по среду работаем десять часов, в четверг и пятницу по 12, а в выходные по 4.
Можно посчитать среднее количество чека в час, и перемножить на часы в каждый день.
Но нужно чтобы было целое число в каждом дне.
Например остается после округлений 3 элемента. И как бы их разложить между наибольшими.
Пришли в голову жадные алгоритмы, но как-то решения так и не пришло.
Если только отсортировать по макс часам, и закидать по единичке в порядке убывания.
Хотелось бы например для случая например на верху будет 18 часов, а след за ним 12 часов, и логично бы было закинуть в 18 2 чека, а в 10 1 чек и прочие догадки
  • Вопрос задан
  • 174 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 2
@magarif
Программист
Мне кажется как-то так:

1) Считаете количество часов в неделе
10 + 10 + 10 + 12 + 12 + 4 + 4 = 62
2) Делите с остатком ( в php смотреть знак %) количество чеков на количество часов
800 / 62 = 12 и остаток 56
3) Считаете отношение часов в днях от общей суммы
10 / 62 = 0,1613
12 / 62 = 0,1935
4 / 62 = 0,0645
4) По отношениям раскидываете остаток по дням
56 * 0,1613 = 9,03 (пн, вт, ср)
56 * 0,1935 = 10,84 (чт, пт)
56 * 0,0645 = 3,61 (сб, вс)
5) Откидываем целые по дням и исключаем эти дни
6) остатки складываем и повторяем пункт 4
Ответ написан
Комментировать
@kantenbors
Задача типовая.
Имеется типовое решение - расчет накопительным итогом:
Round(10/62*800)-Round(0/62*800)=129
Round((10+10)/62*800)-Round(10/62*800)=129
Round((10+10+10)/62*800)-Round((10+10)/62*800)=129
Round((10+10+10+12)/62*800)-Round((10+10+10)/62*800)=155
Round((10+10+10+12+12)/62*800)-Round((10+10+10+12)/62*800)=155
Round((10+10+10+12+12+4)/62*800)-Round((10+10+10+12+12)/62*800)=51
Round((10+10+10+12+12+4+4)/62*800)-Round((10+10+10+12+12+4)/62*800)=52
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
dimonchik2013
@dimonchik2013
non progredi est regredi
без формализации одним потоком сознания сложно

но 56 чеков, которые остаются после дележки 800 на 62 часа можете делить вполне по весам дней с округлением в нижнюю сторону - чтобы выходные не всегда получали добавленные
Ответ написан
Комментировать
@Zanak
Если вам действительно нужен ответ на ваш вопрос, то соберитесь, и попробуйте сформулировать его еще раз :)
Есть какое - то количество чеков, это понятно.
Есть график работы, это тоже понятно.

Можно посчитать среднее количество чека в час, и перемножить на часы в каждый день.
Но нужно чтобы было целое число в каждом дне.

Можно посчитать, а можно не считать. Что в итоге нужно? Оценить количество покупателей в разные моменты времени? Или правдоподобно раскидать количество чеков по дням?
Если приводите пример расчета, то будьте аккуратнее в его изложении. В исходных данных фигурируют цифры 4, 10 и 12 часов, откуда взялись 18?

Если говорить об идее с назначением весов дням, я попробовал бы так:
- посчитал веса в группе 10+10+10+4+4, и раскидал в их соответствии то, что осталось от группы 12+12
- далее распределил бы остатки от группы 10+10+10 по паре 4+4
- неделимый остаток от группы 4+4 (это от 0 до 3 чеков) просто отбросил бы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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