Три спички
Вдоль прямой выложены три спички. Необходимо переложить одну из них так, чтобы при поджигании любой спички сгорали все три. Для того чтобы огонь переходил с одной спички на другую, необходимо чтобы эти спички соприкасались (хотя бы концами).
Требуется написать программу, определяющую, какую из трех спичек необходимо переместить.
Формат ввода
Вводятся шесть целых чисел : l₁, r₁, l₂, r₂, l₃, r₃ – координаты первой, второй и третьей спичек соответственно (0 ≤ lᵢ < rᵢ ≤ 100). Каждая спичка описывается координатами левого и правого концов по горизонтальной оси OX.
Формат вывода
Выведите номер искомой спички. Если возможных ответов несколько, то выведите наименьший из них (наименьший по номеру спички). В случае, когда нет необходимости перемещать какую-либо спичку, выведите 0. Если же требуемого результата достигнуть невозможно, то выведите -1.
Sample Input:
0
2
4
5
3
6
Sample Output:
1
C/C++
Нужен готовый ответ по C++
А на Питоне нельзя?
Вводим список из пар координат, сразу упорядочивая координаты внутри пары по возрастанию (l должно быть меньше r).
Отдельно формируем сортированный список координат, чтобы первая спичка начиналась как можно левее, а последняя - как можно правее. И держим список соответствия, чтобы найти исходный номер спички.
Дальше смотрим, захватывают ли спички непрерывный диапазон (каждая r больше или равна l следующей спички). Если захватывают, то возвращаем 0.
Дальше смотрим, приведёт ли перемещение самой левой спички к закрытию промежутка между второй и третьей (длина спички не меньше промежутка). Если приведёт, то возвращаем исходный номер самой левой спички.
Дальше смотрим, приведёт ли перемещение самой правой спички к закрытию промежутка между первой и второй (длина спички не меньше промежутка). Если приведёт, то возвращаем исходный номер самой правой спички.
Среднюю спичку трогать не надо, это не поможет. Так что если до сих пор не нашли варианта перемещения, то возвращаем -1.
На Питоне это - 8 строк при использовании функционального аппарата. На C++ будут все 30, в силу низкого уровня синтаксиса языка и отсутствия инструментария. Например, так:
from itertools import pairwise
coords = list(map(sorted, zip(*(map(int, map(input, ('',) * 6)),) * 2)))
sortidx = sorted(range(3), key = coords.__getitem__)
(l1, r1), (l2, r2), (l3, r3) = sortc = list(map(coords.__getitem__, sortidx))
print(0 if all(r >= l for (_, r), (l, _) in pairwise(sortc))
else sortidx.index(0) + 1 if r1 - l1 >= l3 - r2
else sortidx.index(2) + 1 if r3 - l3 >= l2 - r1
else -1)
Принцип простой:Вводим список из пар координат, сразу упорядочивая координаты внутри пары по возрастанию (l должно быть меньше r).
Отдельно формируем сортированный список координат, чтобы первая спичка начиналась как можно левее, а последняя - как можно правее. И держим список соответствия, чтобы найти исходный номер спички.
Дальше смотрим, захватывают ли спички непрерывный диапазон (каждая r больше или равна l следующей спички). Если захватывают, то возвращаем 0.
Дальше смотрим, приведёт ли перемещение самой левой спички к закрытию промежутка между второй и третьей (длина спички не меньше промежутка). Если приведёт, то возвращаем исходный номер самой левой спички.
Дальше смотрим, приведёт ли перемещение самой правой спички к закрытию промежутка между первой и второй (длина спички не меньше промежутка). Если приведёт, то возвращаем исходный номер самой правой спички.
Среднюю спичку трогать не надо, это не поможет. Так что если до сих пор не нашли варианта перемещения, то возвращаем -1.
На Питоне это - 8 строк при использовании функционального аппарата. На C++ будут все 30, в силу низкого уровня синтаксиса языка и отсутствия инструментария. Например, так:
#include
#include
using namespace std;
int coord[3][2];
bool cmp(const size_t a, const size_t b) {
return coord[a][0] < coord[b][0]
|| (coord[a][0] == coord[b][0] && coord[a][1] < coord[b][1]);
}
int getmovable(size_t si[3]) {
if (coord[si[0]][1] >= coord[si[1]][0] && coord[si[1]][1] >= coord[si[2]][0])
return 0;
if (coord[si[0]][1] - coord[si[0]][0] >= coord[si[2]][0] - coord[si[1]][1])
return si[0] + 1;
if (coord[si[2]][1] - coord[si[2]][0] >= coord[si[1]][0] - coord[si[0]][1])
return si[2] + 1;
return -1;
}
int main() {
for (size_t i = 0; i < 3; i++)
cin >> coord[i][0] >> coord[i][1];
size_t sortidx[3] = { 0, 1, 2 };
sort(sortidx, sortidx + 3, cmp);
cout
Похожие вопросы
- Нужны готовые ответ на C++
- Нужен готовый ответ на C++
- Нужен готовый код по C++ рабочий без ошибок C++
- Нужен готовый код по C++
- Помощь нужна готовые ответы
- Для чего нужен Push_Back() в C++
- Задача по c++ на векторы. Часть программы написана. Нужны правки.
- Нужна помощь с выполнением заданий в C++
- Нужна помощь при решении задачи в c++
- Знатоки C++ и математики. Нужна ваша помощь.