Сортировать по добавлению ячеек, пока сумма не достигнет 60

Вопрос или проблема

У меня есть пример набора данных. Числа представляют собой минуты.

обед       48.00
учёба      90.00
дремота     45.00
тренировка 30.00
ужин       20.00
приготовление еды 60.00
молитва    21.00

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

Моя цель – получить как можно больше сумм по 60 из этого набора данных.

Ниже я привёл желаемые результаты.

Час 1 (48 минут обед и 12 минут учёбы) 60 минут всего
Час 2 (60 минут учёбы) 60 минут всего
Час 3 (18 минут учёбы и 42 минуты дремоты) 60 минут всего
Час 4 (3 минуты дремоты, 30 минут тренировки, 20 минут ужина и 7 минут приготовления еды) 60 минут всего
Час 5 (53 минуты приготовления еды и 7 минут молитвы) 60 минут всего
Час 6 (4 минуты молитвы)

Если у вас есть Office 365:

=LET(
    _it,A1:A15,
    _MN,B1:B15,
    _sum,SUM(_MN),
    _s,SEQUENCE(_sum),
    _hr,SEQUENCE(ROUNDUP(_sum/60,0)),
    _arr,HSTACK(_s,INDEX(_it,MATCH(_s,VSTACK(0,SCAN(1,_MN,LAMBDA(_z,_y,_z+_y)))))),
    _rd,REDUCE(0,_hr,LAMBDA(_a,_b,VSTACK(_a,UNIQUE(FILTER(HSTACK(SEQUENCE(_s,,_b,0),TAKE(_arr,,-1)),(TAKE(_arr,,1)>=60*(_b-1)+1)*(TAKE(_arr,,1)<=60*_b)))))),
    _drp,DROP(_rd,1),
    _rw,BYROW(_drp,LAMBDA(_t,COUNTA(FILTER(TAKE(_arr,,-1),(TAKE(_arr,,1)>=60*(@INDEX(_t,1,1)-1)+1)*(TAKE(_arr,,1)<=60*@INDEX(_t,1,1))*(TAKE(_arr,,-1) = @INDEX(_t,1,2)))))),
    VSTACK(HSTACK("Час","Элемент","Минуты"),HSTACK(_drp,_rw)))

Это возьмёт входные данные и сначала создаст массив каждой минуты и активности, происходящей в этой минуте. Затем он использует фильтр, чтобы сначала отфильтровать по каждому часу. Затем он использует это для выполнения другого фильтра, чтобы подсчитать количество минут каждой активности в этом часе. Затем он собирает всё вместе с заголовками, чтобы распечатать результаты.

введите описание изображения здесь

Предложение решения с формулами, как показано на следующей иллюстрации:
Активность

Содержимое ячеек:
D2: 1
E2: =INDEX($A$1:$A$15,1)
F2: =IF(E2="","",MIN(VLOOKUP(E2,$A$1:$B$15,2,FALSE)-SUMIF(E$1:E1,E2,F$1:F1), 60-SUMIF(D$1:D1,D2,F$1:F1)))
D3: =IF(SUM(F$2:F2)=SUM($B$1:$B$15), "", IF(SUMIF(D$2:D2,D2,F$2:F2)<60,D2,D2+1))
E3: =IF(D3="","",IF(SUMIF(E$2:E2,E2,F$2:F2)

Ответ или решение

Сортировка по сумме активностей до достижения 60 минут

Введение

В данной задаче мы имеем множество активностей, каждая из которых занимает определенное количество времени в минутах. Цель состоит в том, чтобы сгруппировать эти активности по часам так, чтобы сумма времени каждой группы не превышала 60 минут. Это позволяет эффективнее планировать день, укладывая разные активности в рамках одного часа.

Данные

Рассмотрим следующий набор временных показателей для различных активностей:

lunch       48.00
study       90.00
nap         45.00
workout     30.00
dinner      20.00
meal prep   60.00
pray        21.00

Здесь, каждая строка содержит название активности и соответствующее время, проведенное за ней, в минутах.

Подход

Мы будем обрабатывать данные, учитывая следующее:

  1. Сохраним порядок активностей.
  2. Каждую активность будем добавлять в часы до достижения суммы в 60 минут.
  3. Если текущая активность превышает 60 минут, она будет разбита на несколько частей.

Решение

Для достижения поставленной цели, можно использовать предложенные формулы Excel. Приведем их подробнее:

Формулы в Excel

Для того чтобы автоматизировать процесс, можно использовать следующие формулы.

  1. Создание первого часа и добавление активностей:

    • В ячейке D2 указываем номер часа: 1.
    • В ячейке E2 выбираем первую активность: =INDEX($A$1:$A$15,1).
    • В ячейке F2 определяем, сколько времени мы можем выделить на активность с учетом предыдущих значений:
      =IF(E2="","",MIN(VLOOKUP(E2,$A$1:$B$15,2,FALSE)-SUMIF(E$1:E1,E2,F$1:F1), 60-SUMIF(D$1:D1,D2,F$1:F1)))
  2. Продолжение добавления активностей:

    • Для ячейки D3 проверяем, нужно ли увеличивать номер часа:
      =IF(SUM(F$2:F2)=SUM($B$1:$B$15), "", IF(SUMIF(D$2:D2,D2,F$2:F2)<60,D2,D2+1))
    • Для E3 выбираем следующую активность:
      =IF(D3="","",IF(SUMIF(E$2:E2,E2,F$2:F2)<VLOOKUP(E2,$A$1:$B$15,2,FALSE), E2, INDEX($A$1:$A$15,MATCH(E2,$A$1:$A$15,0)+1)))

Итоговые результаты

В результате выполнения вышеописанных шагов, вы сможете увидеть, какие активности блокируются в рамках каждого часа до достижения 60 минут. Пример вывода может выглядеть следующим образом:

  • Час 1: 48 мин (обед) + 12 мин (учеба) = 60 мин
  • Час 2: 60 мин (учеба) = 60 мин
  • Час 3: 18 мин (учеба) + 42 мин (дремота) = 60 мин
  • Час 4: 3 мин (дремота) + 30 мин (тренировка) + 20 мин (ужин) + 7 мин (приготовление еды) = 60 мин
  • Час 5: 53 мин (приготовление еды) + 7 мин (молитва) = 60 мин
  • Час 6: 4 мин (молитва) = 60 мин

Заключение

Таким образом, мы можем эффективно распределить время на различные виды активности в течение дня, не превышая допустимых 60 минут на каждый час. Используя предложенные формулы, вы сможете легко управлять своим расписанием, оптимизируя его под свои нужды. Этот подход подходит как для личного использования, так и для профессиональной деятельности, позволяя поддерживать структуру и порядок в планировании времени.

Оцените материал
Добавить комментарий

Капча загружается...