Вычислить строки с пересекающимися интервалами чисел
Есть N контейнеров. У каждого контейнера есть требования к температуре перевозки. Требования задаются диапазоном, границы которого являются целыми числами от -100 до 100.
Перевозка контейнеров осуществляется с помощью специальных грузовиков с термостатами. Каждый термостат можно настроить на одну фиксированную температуру от -100 до 100.
Масса и габариты контейнеров, а также вместимость и грузоподъемность грузовиков в задаче не учитывается - то есть, в один грузовик можно погрузить неограниченное количество контейнеров.
Нужно определить минимальное количество грузовиков, с помощью которых можно перевезти заданный набор грузов, не нарушая их температурный режим. Решение выведите в виде списка машин, с указанием в какой машине какой температурный режим следует установить, и какие контейнеры загрузить.
МЕНЯ ИНТЕРЕСУЕТ РЕШЕНИЕ ЗАДАЧИ ЗАПРОСОМ. БЕЗ ПОСТОБРАБОТКИ.
Пример
Входные данные:
Номер Нижняя граница Верхняя граница
1 -50 -25
2 0 10
3 10 15
4 0 50
5 -25 -25
6 -25 10
7 70 100
Результат:
Номер Температура Контейнеры
1 10 2, 3, 4
2 -25 1, 5, 6
3 70 7
Перевозка контейнеров осуществляется с помощью специальных грузовиков с термостатами. Каждый термостат можно настроить на одну фиксированную температуру от -100 до 100.
Масса и габариты контейнеров, а также вместимость и грузоподъемность грузовиков в задаче не учитывается - то есть, в один грузовик можно погрузить неограниченное количество контейнеров.
Нужно определить минимальное количество грузовиков, с помощью которых можно перевезти заданный набор грузов, не нарушая их температурный режим. Решение выведите в виде списка машин, с указанием в какой машине какой температурный режим следует установить, и какие контейнеры загрузить.
МЕНЯ ИНТЕРЕСУЕТ РЕШЕНИЕ ЗАДАЧИ ЗАПРОСОМ. БЕЗ ПОСТОБРАБОТКИ.
Пример
Входные данные:
Номер Нижняя граница Верхняя граница
1 -50 -25
2 0 10
3 10 15
4 0 50
5 -25 -25
6 -25 10
7 70 100
Результат:
Номер Температура Контейнеры
1 10 2, 3, 4
2 -25 1, 5, 6
3 70 7
Найденные решения
(11)
Подкорректировал первое решение
Подкорректировал первое решение
// Данные
ВЫБРАТЬ Т.Номер, Т.НижТемп, Т.ВерхТемп
Поместить Данные
из &Т как Т
;
// Выражение2
ВЫБРАТЬ
Т.Номер КАК Номер,
Т2.Номер КАК Номер2,
Т.НижТемп КАК НижТемп,
Т.ВерхТемп КАК ВерхТемп
ПОМЕСТИТЬ Наборы
ИЗ
Данные КАК Т
ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Т2
ПО (Т2.НижТемп <= Т.ВерхТемп)
И (Т2.ВерхТемп >= Т.НижТемп);
// Наборы
ВЫБРАТЬ
МИНИМУМ(Т.ВерхТемп) КАК ВерхТемп,
Т.Номер2 КАК Номер
ИЗ
Наборы КАК Т
СГРУППИРОВАТЬ ПО
Т.Номер2
УПОРЯДОЧИТЬ ПО
ВерхТемп;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Создаем таблицу значений с колонками КоличествоПересечений и МассивНомеровКонтейнеров. Количество строк ТЗ соответствует максимальному диапазону температуры – 201. Для каждого контейнера обходим ТЗ в соответствии с температурным диапазоном, добавляя 1 к КоличествоПересечений и добавляя номер контейнера в МассивНомеровКонтейнеров. Сортируем ТЗ по КоличествоПересечений по убыванию. Первая строка ТЗ – будет первой строкой результата. Исключаем из искомого массива контейнеров контейнеры из первой строки ТЗ. Повторяем всё для оставшихся контейнеров и так далее в рекурсии.
(1) Держи запрос:
// Данные
ВЫБРАТЬ Т.Номер, Т.НижТемп, Т.ВерхТемп
Поместить Данные
из &Т как Т
;
// Выражение2
ВЫБРАТЬ
Т.Номер КАК Номер,
Т2.Номер КАК Номер2,
Т.НижТемп КАК НижТемп,
Т.ВерхТемп КАК ВерхТемп
Поместить Наборы
ИЗ
Данные КАК Т
ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Т2
ПО (Т2.НижТемп <= Т.ВерхТемп
И Т2.ВерхТемп >= Т.НижТемп
ИЛИ Т.НижТемп <= Т2.ВерхТемп
И Т.ВерхТемп >= Т2.НижТемп)
;
// Наборы
ВЫБРАТЬ
МИНИМУМ(Т.ВерхТемп) КАК ВерхТемп,
Т.Номер2 КАК Номер
ИЗ
Наборы КАК Т
СГРУППИРОВАТЬ ПО
Т.Номер2
УПОРЯДОЧИТЬ ПО
ВерхТемп;
Показать
(11) Кстати вот это условие нифига не понял, одно и тоже условие но через ИЛИ..при том если убрать одну половину соединение как то не так отрабатывает...
Опять же вот это работает
Но если тут сделать полное или левое соединение по
Оно перестает работать, хотя и должно...глюки какие то
(Т2.НижТемп <= Т.ВерхТемп
И Т2.ВерхТемп >= Т.НижТемп
ИЛИ Т.НижТемп <= Т2.ВерхТемп
И Т.ВерхТемп >= Т2.НижТемп)
Опять же вот это работает
ВЫБРАТЬ
Т.Номер КАК Номер,
Т2.Номер КАК Номер2,
ВЫБОР
КОГДА Т.ВерхТемп >=Т2.НижТемп
И Т.НижТемп <= Т2.ВерхТемп
ТОГДА Т.НижТемп
ИНАЧЕ Т2.НижТемп
КОНЕЦ КАК Темп
ПОМЕСТИТЬ Данные
ИЗ
ВТ_Таблица КАК Т
, ВТ_Таблица КАК Т2
ПоказатьНо если тут сделать полное или левое соединение по
Т.Номер >= Т2.Номер
(14) Так варианты абсолютно идентичные
вот так работает
Убираем одну половину...не работает тут условие ИЛИ т.е.или первое условие верно или второе, но условия одинаковые ???
И кстати вот это условие отрабатывает и одно без ИЛИ, тут просто соединяем ПО если Т входит в Диапазон Т2
На выходе получим тоже самое
вот так работает
ПО ( Т.НижТемп <= Т2.ВерхТемп
И Т.ВерхТемп >= Т2.НижТемп
ИЛИ Т.НижТемп <= Т2.ВерхТемп
И Т.ВерхТемп >= Т2.НижТемп)
Убираем одну половину...не работает тут условие ИЛИ т.е.или первое условие верно или второе, но условия одинаковые ???
И кстати вот это условие отрабатывает и одно без ИЛИ, тут просто соединяем ПО если Т входит в Диапазон Т2
ПО ( Т.ВерхТемп <= Т2.ВерхТемп
И Т.НижТемп >= Т2.НижТемп)
На выходе получим тоже самое
(16)Можно и не менять, результат не изменится, да и в условии какая разница кто первый стоит
Вот это
И
От этого условие не станет другим, так как 1<=2 И 2>=1 дадут одинаковый результат истину
Я уже весь мозг свернул
А чем тогда эти условия отличаться, результат от вашего не меняется....но блин нужно это второе ИЛИ, тут что то не так соединение именно отрабатывает
Ну тут явно какой то косяк, может это файловый вариант так работает, нужно на SQL попробовать, но это на работе только...смогу проверить
Вот это
Т2.НижТемп <= Т.ВерхТемп
Т.ВерхТемп >= Т2.НижТемп
От этого условие не станет другим, так как 1<=2 И 2>=1 дадут одинаковый результат истину
Я уже весь мозг свернул
А чем тогда эти условия отличаться, результат от вашего не меняется....но блин нужно это второе ИЛИ, тут что то не так соединение именно отрабатывает
ПО Т.НижТемп <= Т2.ВерхТемп
И Т.ВерхТемп >= Т2.НижТемп
ИЛИ Т.НижТемп <= Т2.ВерхТемп
И Т.ВерхТемп >= Т2.НижТемп
Ну тут явно какой то косяк, может это файловый вариант так работает, нужно на SQL попробовать, но это на работе только...смогу проверить
(19)
Вы правы, вторая часть повторяет первую. А я и не заметил)))
Кстати, закомментировал, вторую часть и решение не изменилось, получил тот же результат
Вы правы, вторая часть повторяет первую. А я и не заметил)))
Кстати, закомментировал, вторую часть и решение не изменилось, получил тот же результат
ВЫБРАТЬ
Т.Номер КАК Номер,
Т2.Номер КАК Номер2,
Т.НижТемп КАК НижТемп,
Т.ВерхТемп КАК ВерхТемп
ПОМЕСТИТЬ Наборы
ИЗ
Данные КАК Т
ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Т2
ПО (Т2.НижТемп <= Т.ВерхТемп
И Т2.ВерхТемп >= Т.НижТемп
//ИЛИ Т.НижТемп <= Т2.ВерхТемп
// И Т.ВерхТемп >= Т2.НижТемп
);
Показать
(11)
Подкорректировал первое решение
Подкорректировал первое решение
// Данные
ВЫБРАТЬ Т.Номер, Т.НижТемп, Т.ВерхТемп
Поместить Данные
из &Т как Т
;
// Выражение2
ВЫБРАТЬ
Т.Номер КАК Номер,
Т2.Номер КАК Номер2,
Т.НижТемп КАК НижТемп,
Т.ВерхТемп КАК ВерхТемп
ПОМЕСТИТЬ Наборы
ИЗ
Данные КАК Т
ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Т2
ПО (Т2.НижТемп <= Т.ВерхТемп)
И (Т2.ВерхТемп >= Т.НижТемп);
// Наборы
ВЫБРАТЬ
МИНИМУМ(Т.ВерхТемп) КАК ВерхТемп,
Т.Номер2 КАК Номер
ИЗ
Наборы КАК Т
СГРУППИРОВАТЬ ПО
Т.Номер2
УПОРЯДОЧИТЬ ПО
ВерхТемп;
Показать
Эх студенты, видать задачка на собеседование
Держите по быстрому набросал
Держите по быстрому набросал
Прикрепленные файлы:
ПоискНаименьшего.epf
(9)
на совсем понял условия
контейнеры с разными диапазонами
могут присутствовать на одном грузовике
но в разных термостатах ?
на совсем понял условия
контейнеры с разными диапазонами
могут присутствовать на одном грузовике
но в разных термостатах ?
Прикрепленные файлы:
Интервал.svg
Приветствую. В (22) пробовал такую комбинацию входных параметров контейнеров :
1к [0 ; 10]
2к [10 ; 15]
3к [0 ; 50]
4к [-25 ; 10]
5к [15 ; 50]
6к [15 ; 70]
7к [2 ; 5]
Получил распределение :
5 - 4,7,1,3
10 - 2
15 - 5,6
Что не верно, т.к. 2-й контейнер по хорошему тоже должен в 15 относиться. Думаю проблема в том, по какой температуре считаем агрегатную функцию. Наверно получить правильный ответ только запросом тут не получится.
1к [0 ; 10]
2к [10 ; 15]
3к [0 ; 50]
4к [-25 ; 10]
5к [15 ; 50]
6к [15 ; 70]
7к [2 ; 5]
Получил распределение :
5 - 4,7,1,3
10 - 2
15 - 5,6
Что не верно, т.к. 2-й контейнер по хорошему тоже должен в 15 относиться. Думаю проблема в том, по какой температуре считаем агрегатную функцию. Наверно получить правильный ответ только запросом тут не получится.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот