Вычислить строки с пересекающимися интервалами чисел

1. kuza_87 28 11.06.21 16:38 Сейчас в теме
Есть 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
blockcode; +1 Ответить
Вознаграждение за ответ
Показать полностью
Найденные решения
22. blockcode 40 13.06.21 15:34 Сейчас в теме +5 $m
(11)
Подкорректировал первое решение

//   Данные

ВЫБРАТЬ Т.Номер, Т.НижТемп, Т.ВерхТемп 
Поместить Данные
из &Т как Т
;

//   Выражение2

ВЫБРАТЬ
	Т.Номер КАК Номер,
	Т2.Номер КАК Номер2,
	Т.НижТемп КАК НижТемп,
	Т.ВерхТемп КАК ВерхТемп
ПОМЕСТИТЬ Наборы
ИЗ
	Данные КАК Т
		ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Т2
		ПО (Т2.НижТемп <= Т.ВерхТемп)
			И (Т2.ВерхТемп >= Т.НижТемп);

//   Наборы

ВЫБРАТЬ
	МИНИМУМ(Т.ВерхТемп) КАК ВерхТемп,
	Т.Номер2 КАК Номер
ИЗ
	Наборы КАК Т

СГРУППИРОВАТЬ ПО
	Т.Номер2

УПОРЯДОЧИТЬ ПО
	ВерхТемп;
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 34 11.06.21 16:52 Сейчас в теме
(1) А в чем проблема?
В первом цикле обходим таблицу с входными данными и для каждой строки во вложенном цикле проверяем остальные строки таблицы. Если подходящая строка, записываем ее в результат.
4. user856012 13 11.06.21 17:35 Сейчас в теме
(2)
А в чем проблема?
Судя по размеру вознаграждения - в готовом коде. ;)
3. SlavaKron 11.06.21 17:19 Сейчас в теме
(1) Создаем таблицу значений с колонками КоличествоПересечений и МассивНомеровКонтейнеров. Количество строк ТЗ соответствует максимальному диапазону температуры – 201. Для каждого контейнера обходим ТЗ в соответствии с температурным диапазоном, добавляя 1 к КоличествоПересечений и добавляя номер контейнера в МассивНомеровКонтейнеров. Сортируем ТЗ по КоличествоПересечений по убыванию. Первая строка ТЗ – будет первой строкой результата. Исключаем из искомого массива контейнеров контейнеры из первой строки ТЗ. Повторяем всё для оставшихся контейнеров и так далее в рекурсии.
11. blockcode 40 12.06.21 15:20 Сейчас в теме
(1) Держи запрос:
//   Данные

ВЫБРАТЬ Т.Номер, Т.НижТемп, Т.ВерхТемп 
Поместить Данные
из &Т как Т
;

//   Выражение2

ВЫБРАТЬ
	Т.Номер КАК Номер,
	Т2.Номер КАК Номер2,
	Т.НижТемп КАК НижТемп,
	Т.ВерхТемп КАК ВерхТемп
Поместить Наборы
ИЗ
	Данные КАК Т
		ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Т2
		ПО (Т2.НижТемп <= Т.ВерхТемп
					И Т2.ВерхТемп >= Т.НижТемп
				ИЛИ Т.НижТемп <= Т2.ВерхТемп
					И Т.ВерхТемп >= Т2.НижТемп)
;

//   Наборы

ВЫБРАТЬ
	МИНИМУМ(Т.ВерхТемп) КАК ВерхТемп,
	Т.Номер2 КАК Номер
ИЗ
	Наборы КАК Т

СГРУППИРОВАТЬ ПО
	Т.Номер2

УПОРЯДОЧИТЬ ПО
	ВерхТемп;


Показать
12. bmk74 234 12.06.21 17:29 Сейчас в теме
13. bmk74 234 12.06.21 20:12 Сейчас в теме
(11) Кстати вот это условие
 (Т2.НижТемп <= Т.ВерхТемп
                    И Т2.ВерхТемп >= Т.НижТемп
                ИЛИ Т.НижТемп <= Т2.ВерхТемп
                    И Т.ВерхТемп >= Т2.НижТемп)
нифига не понял, одно и тоже условие но через ИЛИ..при том если убрать одну половину соединение как то не так отрабатывает...
Опять же вот это работает
ВЫБРАТЬ
	Т.Номер КАК Номер,
	Т2.Номер КАК Номер2,
	ВЫБОР
		КОГДА Т.ВерхТемп >=Т2.НижТемп
					И Т.НижТемп <= Т2.ВерхТемп
			ТОГДА Т.НижТемп
		
		ИНАЧЕ Т2.НижТемп
	КОНЕЦ КАК Темп
ПОМЕСТИТЬ Данные
ИЗ
	ВТ_Таблица КАК Т
		, ВТ_Таблица КАК Т2
Показать

Но если тут сделать полное или левое соединение по
Т.Номер >= Т2.Номер
Оно перестает работать, хотя и должно...глюки какие то
14. blockcode 40 13.06.21 11:00 Сейчас в теме
(13)
ИЛИ необходимо, чтобы отработать 2 варианта:
1) промежуток Т ниже и имеет общие точки с Т2
2) промежуток Т выше и имеет общие точки с Т2

а далее можно группировать, как по МИНИМУМ(Т.ВерхТемп), так и по МАКСИМУМ(Т.НижТемп),
то есть получаем 2 решения
15. bmk74 234 13.06.21 13:39 Сейчас в теме
(14) Так варианты абсолютно идентичные
вот так работает
ПО ( Т.НижТемп <= Т2.ВерхТемп
				И Т.ВерхТемп >= Т2.НижТемп
	    ИЛИ Т.НижТемп <= Т2.ВерхТемп
				И Т.ВерхТемп >= Т2.НижТемп)

Убираем одну половину...не работает тут условие ИЛИ т.е.или первое условие верно или второе, но условия одинаковые ???

И кстати вот это условие отрабатывает и одно без ИЛИ, тут просто соединяем ПО если Т входит в Диапазон Т2
ПО (  Т.ВерхТемп <= Т2.ВерхТемп
			И Т.НижТемп >= Т2.НижТемп)

На выходе получим тоже самое
16. blockcode 40 13.06.21 14:11 Сейчас в теме
(15) условия не одинаковые
        ПО (Т2.НижТемп <= Т.ВерхТемп
                    И Т2.ВерхТемп >= Т.НижТемп

во втором Т и Т2 меняются местами
                ИЛИ Т.НижТемп <= Т2.ВерхТемп
                    И Т.ВерхТемп >= Т2.НижТемп)
17. bmk74 234 13.06.21 14:30 Сейчас в теме
(16)Можно и не менять, результат не изменится, да и в условии какая разница кто первый стоит
Вот это
Т2.НижТемп <= Т.ВерхТемп
И
Т.ВерхТемп >= Т2.НижТемп

От этого условие не станет другим, так как 1<=2 И 2>=1 дадут одинаковый результат истину


Я уже весь мозг свернул
А чем тогда эти условия отличаться, результат от вашего не меняется....но блин нужно это второе ИЛИ, тут что то не так соединение именно отрабатывает
ПО  Т.НижТемп <= Т2.ВерхТемп
                    И Т.ВерхТемп >= Т2.НижТемп
                ИЛИ Т.НижТемп <= Т2.ВерхТемп
                    И Т.ВерхТемп >= Т2.НижТемп


Ну тут явно какой то косяк, может это файловый вариант так работает, нужно на SQL попробовать, но это на работе только...смогу проверить
18. blockcode 40 13.06.21 14:44 Сейчас в теме
(17)
1<=2 И 2>=1

не совсем так, правильнее x1 <= x2 или x2 <= x1
переменные меняем местами а знак не меняем
19. bmk74 234 13.06.21 14:50 Сейчас в теме
(18)Хорошо это же ваши условия ?
Т2.НижТемп <= Т.ВерхТемп
т.е x2<=x1
ИЛИ 

Т.ВерхТемп >= Т2.НижТемп
т.е. х1>=x2

е совсем так, правильнее x1 <= x2 или x2 <= x1

А вот этого нету в ваших условиях как впрочем и у меня
20. blockcode 40 13.06.21 15:27 Сейчас в теме
(19)
Вы правы, вторая часть повторяет первую. А я и не заметил)))
Кстати, закомментировал, вторую часть и решение не изменилось, получил тот же результат

ВЫБРАТЬ
	Т.Номер КАК Номер,
	Т2.Номер КАК Номер2,
	Т.НижТемп КАК НижТемп,
	Т.ВерхТемп КАК ВерхТемп
ПОМЕСТИТЬ Наборы
ИЗ
	Данные КАК Т
		ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Т2
		ПО (Т2.НижТемп <= Т.ВерхТемп
					И Т2.ВерхТемп >= Т.НижТемп
				//ИЛИ Т.НижТемп <= Т2.ВерхТемп
				//	И Т.ВерхТемп >= Т2.НижТемп
					);
Показать
21. bmk74 234 13.06.21 15:31 Сейчас в теме
(20)Воот, а у меня при таком, почему то последняя строка 7 где от 70 до 100, не соединяется, значит все таки глюк
У вас Файловый вариант или SQL ?
23. blockcode 40 13.06.21 15:36 Сейчас в теме
(21) SQL
я к рабочему серверу подключился, там проверил
24. bmk74 234 13.06.21 15:42 Сейчас в теме
(23) Значит это глюки файлового варианта...да уж, не часто на нем запросы отрабатываю...не знал про такие косяки...
22. blockcode 40 13.06.21 15:34 Сейчас в теме +5 $m
(11)
Подкорректировал первое решение

//   Данные

ВЫБРАТЬ Т.Номер, Т.НижТемп, Т.ВерхТемп 
Поместить Данные
из &Т как Т
;

//   Выражение2

ВЫБРАТЬ
	Т.Номер КАК Номер,
	Т2.Номер КАК Номер2,
	Т.НижТемп КАК НижТемп,
	Т.ВерхТемп КАК ВерхТемп
ПОМЕСТИТЬ Наборы
ИЗ
	Данные КАК Т
		ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Т2
		ПО (Т2.НижТемп <= Т.ВерхТемп)
			И (Т2.ВерхТемп >= Т.НижТемп);

//   Наборы

ВЫБРАТЬ
	МИНИМУМ(Т.ВерхТемп) КАК ВерхТемп,
	Т.Номер2 КАК Номер
ИЗ
	Наборы КАК Т

СГРУППИРОВАТЬ ПО
	Т.Номер2

УПОРЯДОЧИТЬ ПО
	ВерхТемп;
Показать
5. kasper076 105 11.06.21 18:51 Сейчас в теме
(1) Почему 6-й контейнер перевозится при -25, не при 10?
7. bmk74 234 11.06.21 18:57 Сейчас в теме
(5)Он в принципе входит в 2 диапазона, поэтому решение может быть и немного другим
6. bmk74 234 11.06.21 18:56 Сейчас в теме
Эх студенты, видать задачка на собеседование
Держите по быстрому набросал
Прикрепленные файлы:
ПоискНаименьшего.epf
8. МихаилМ 11.06.21 19:40 Сейчас в теме
(0)
https://infostart.ru/1c/articles/551583/


скажите максимальное количество контейнеров.
9. kuza_87 28 12.06.21 11:22 Сейчас в теме
В обработке я и сам уже сделал решение. Меня интересует решение запросом.
10. XAKEP 12.06.21 12:03 Сейчас в теме
(9)
на совсем понял условия

контейнеры с разными диапазонами

могут присутствовать на одном грузовике

но в разных термостатах ?
Прикрепленные файлы:
Интервал.svg
25. Nice_one 02.12.23 19:35 Сейчас в теме
Приветствую. В (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 относиться. Думаю проблема в том, по какой температуре считаем агрегатную функцию. Наверно получить правильный ответ только запросом тут не получится.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот