Задание 3. Фигуры из квадратов Из трёх одинаковых квадратов путём соединения их край в край можно получить две разные фигуры:
Фигуры будем считать разными, если одну нельзя получиз другой поворотом или отражением. Поэтому,
например, следующие фигуры считаются одинаковыми:
Сколько разных фигур можно получить, соединяя одинаковые квадраты край в край? Проведите исследование для четырёх и пяти квадратов. Постройте свои фигуры из трёх одинаковых квадратов. Сохраните результат работы в личной папке под именем Квадраты.
Требуется найти максимум этого выражения (т.е. на самом деле - максимум суммы квадратов) при условии, что сумма всех ni равна N и ni - натуральные числа.
Если K = 1, то всё очевидно - ответ N(N - 1)/2. Пусть K > 1.
Предположим, n1 <= n2 <= ... <= nK - набор чисел, для которых достигается максимум, и n1 > 1. Уменьшим число вершин в первой компоненте связности до 1, а оставшиеся вершины "перекинем" в K-ую компоненту связности. Вычислим, как изменится сумма квадратов:
Поскольку по предположению n1 > 1 (тогда и nK > 1), то сумма квадратов увеличится, что противоречит предположению о том, что на выбранном изначально наборе достигается максимум. Значит, максимум достигается, если наименьшая по размеру компонента связности - изолированная вершина. Выкинем эту компоненту связности, останутся K - 1 компонента связности и N - 1 вершина. Будем продолжать так делать, пока не останется одна вершина, тогда получится, что во всех компонентах связности кроме последней должно быть по одной вершине.
Итак, должно выполняться
Подставив в исходную формулу, получаем
Это и есть ответ.
procedure Convert(V:array of integer);
begin
for var i:=0 to V.Length-1 do
if V[i]>9 then V[i]:=9
else
if V[i]<5 then V[i]:=5
end;
procedure Develop(c:char; k:integer);
begin
WritelnFormat('*** Массив {0} ***',c);
var a:=ArrRandom(k,-5,15);
Write('исходный : '); a.PrintLn(',');
Convert(a);
Write('результат: '); a.PrintLn(',');
end;
begin
var m:=ReadInteger('Количество элементов в массиве A:');
var n:=ReadInteger('Количество элементов в массиве B:');
Develop('A',m);
Develop('B',n)
end.
Тестовое решение:
Количество элементов в массиве A: 15
Количество элементов в массиве B: 10
*** Массив A ***
исходный : 6,5,-5,9,1,0,-3,9,13,12,-4,8,11,14,-5
результат: 6,5,5,9,5,5,5,9,9,9,5,8,9,9,5
*** Массив B ***
исходный : 5,12,12,4,7,9,7,-3,-1,-2
результат: 5,9,9,5,7,9,7,5,5,5