10769. Колонна
Известный архитектор Мистер Фруи
планирует построить колонну для колосса высотой h. У него есть n
черных блоков с высотами b1, …, bn и m
белых блоков с высотами w1, …, wm. Колонна
должна содержать четыре блока, черный блок должен лежать в основании, а далее
цвета блоков должны чередоваться.
Мистер Фруи хочет найти наиболее
устойчивую комбинацию блоков для построения колонны. Комбинация A = (a1,
a2, a3, a4) считается
устойчивее B = (b1, b2, b3,
b4), если либо a1 > b1,
либо a1 = b1 и a2 > b2
и так далее (последовательность высот A лексикографически больше
последовательности высот B).
Вход.
Состоит из нескольких тестов, разделенных пустой строкой. Первая строка теста
содержит желаемую высоту колонны h (1 £ h £ 4*108). Вторая и третья строки содержат соответственно
последовательности b1, …, bn и w1,
…, wm. Все входные числа целые, 2 £ n, m £ 100, высота каждого блока не
более 108.
Выход. Для каждого теста вывести
последовательность высот блоков для наиболее устойчивой колонны. Если колонну
построить невозможно, то вывести сообщение “no solution”.
100
20 20
30 10 30 50
100
20 10 4
50 30 45
20 50 20 10
no solution
полный перебор
Занесем высоты черных блоков в
массив b, а белых – в массив w. Отсортируем эти массивы по
убыванию. Далее делаем полный перебор четверок b[i], w[j],
b[k], w[l] (0 £ i £ lenb-1, 0 £ j £ lenw-1, i + 1 £ k £ lenb, j + 1 £ l £ lenw). Если их сумма равна h, то первая же найденная
четверка будет лексикографически наибольшей и колонна, построенная из этих
блоков, будет наиболее устойчивой.
Пример
Массивы b и w
содержат высоты белых и черных блоков, lenb и lenw –
соответственно длины этих массивов. h – высота колонны.
int b[100], w[100];
int h, lenb, lenw;
Читаем входные данные. Поскольку
не задано в явном виде количество черных и белых блоков, то соответствующие
значения читаем в массивы b и w до тех пор пока не встретится
символ конца строки ‘\n’.
while(scanf("%d",&h)
== 1)
{
for(lenb = 0;
; lenb++)
{
scanf("%d",&b[lenb]);
if((c =
getchar()) == '\n') break;
}
for(lenw = 0;
; lenw++)
{
scanf("%d",&w[lenw]);
if((c =
getchar()) == '\n') break;
}
lenb++; lenw++;
Сортируем по убыванию элементы
массивов b и w. Для использования функции greater следует
включить заголовок #include <functional>.
sort(b,b+lenb,greater<int>());
sort(w,w+lenw,greater<int>());
Перебираем все возможные четверки
b[i], w[j], b[k], w[l]
(0 £ i £ lenb-1, 0 £ j £ lenw-1, i + 1 £ k £ lenb, j + 1 £ l £ lenw). Если сумма некоторой четверки равна h, то присвоим
переменной-флагу found значение 1 и выйдем из цикла.
found = 0;
for(i = 0; i
< lenb - 1; i++)
for(j = 0;
j < lenw - 1; j++)
for(k = i + 1; k < lenb; k++)
for(l =
j + 1; l < lenw; l++)
if
(b[i] + w[j] + b[k] + w[l] == h)
{
found = 1;
goto
fin;
}
Если требуемая четверка была
найдена (found = 1), то выводим ее. Иначе печатаем сообщение о
невозможности построить колонну.
fin:
if (found)
printf("%d %d %d %d\n",b[i],w[j],b[k],w[l]);
else
printf("no solution\n");
}