Uses
Crt;
Var
i, N, kol: byte;
sum_rost, sr_rost: real;
team: array[1..100] of real;
Begin
sum_rost := 0.0;
sr_rost := 0.0;
kol := 0;
write('Введите количество членов команды');
read(N);
writeln('Введите рост каждого члена команды');
for i := 1 to N do
begin
readln(team[i]);
sum_rost := sum_rost + team[i];
end;
sr_rost := sum_rost / N;
for i := 1 to N do
if (team[i] > sr_rost) then
kol := kol + 1;
writeln('Количество членов команды, рост которых превышает средний по команде (', sr_rost:4:2, ')');
write(' равно ', kol);
End.
Я надеюсь надо было на паскале написать?)
Требуется найти максимум этого выражения (т.е. на самом деле - максимум суммы квадратов) при условии, что сумма всех 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 вершина. Будем продолжать так делать, пока не останется одна вершина, тогда получится, что во всех компонентах связности кроме последней должно быть по одной вершине.
Итак, должно выполняться
Подставив в исходную формулу, получаем
Это и есть ответ.