Каждая из компонент связности должна быть кликой (иначе говоря, каждые две вершины в одной компоненте связности должны быть связаны ребром). Если в i-ой компоненте связности вершин, то общее число рёбер будет суммой по всем компонентам связности:
Требуется найти максимум этого выражения (т.е. на самом деле - максимум суммы квадратов) при условии, что сумма всех 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 вершина. Будем продолжать так делать, пока не останется одна вершина, тогда получится, что во всех компонентах связности кроме последней должно быть по одной вершине.
Требуется найти максимум этого выражения (т.е. на самом деле - максимум суммы квадратов) при условии, что сумма всех 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 вершина. Будем продолжать так делать, пока не останется одна вершина, тогда получится, что во всех компонентах связности кроме последней должно быть по одной вершине.
Итак, должно выполняться
Подставив в исходную формулу, получаем
Это и есть ответ.
Извините, что-то я не заметил, что в задании на Паскале надо было написать, поэтому сначала на Питоне написал.
Вот на Паскале:
program HW;
var r,x,y: real;
var chk:string;
begin
write('Введите радиус: '); readln(r);
r := abs(r);
write('Введите X координату точки: '); readln(x);
write('Введите Y координату точки: '); readln(y);
if (x>=0) and (abs(x)<=r) and (y>=0) and (abs(y)<=r) then chk := 'ВХОДИТ'
else if (x<=0) and (abs(x)<=r) and (y<=0) and (abs(y)<=r) then chk := 'ВХОДИТ'
else if (x<=0) and (abs(x)<=r) and (y>=0) and (abs(y)<=r) and (y<=-1*sqrt(sqr(r)-sqr(x+r))+r) then chk := 'ВХОДИТ'
else if (x>=0) and (abs(x)<=r) and (y<=0) and (abs(y)<=r) and (y>=sqrt(sqr(r)-sqr(x-r))-r) then chk := 'ВХОДИТ'
else chk := 'НЕ ВХОДИТ';
writeln('Точка с координатам (', x:1:1, ', ', y:1:1, ') ', chk, ' в выделенную область.');
end.
А это то же на Питоне, вдруг пригодится:
import math
r = abs(float(input("Введите радиус: ")))
x = float(input("Введите X координату точки: "))
y = float(input("Введите Y координату точки: "))
if x>=0 and abs(x)<=r and y>=0 and abs(y)<=r: chk = 'ВХОДИТ'
elif x<=0 and abs(x)<=r and y<=0 and abs(y)<=r: chk = 'ВХОДИТ'
elif x<=0 and abs(x)<=r and y>=0 and abs(y)<=r and y<=-1*math.sqrt(r**2-(x+r)**2)+r: chk = 'ВХОДИТ'
elif x>=0 and abs(x)<=r and y<=0 and abs(y)<=r and y>=math.sqrt(r**2-(x-r)**2)-r: chk = 'ВХОДИТ'
else: chk = 'НЕ ВХОДИТ'
print("Точка с координатам (%.1f, %.1f) %s в выделенную область." % (x, y, chk))