Каждая из компонент связности должна быть кликой (иначе говоря, каждые две вершины в одной компоненте связности должны быть связаны ребром). Если в 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 вершина. Будем продолжать так делать, пока не останется одна вершина, тогда получится, что во всех компонентах связности кроме последней должно быть по одной вершине.
from random import randint
S1 = [randint(1,100) for i in range(20)]
summa1 = 0
summa2 = 0
for i in S1:
if i % 2 == 0:
summa1 += i
else:
summa2 += i
print(f"Сумма чётных = {summa1}")
print(f"Сумма нечёт = {summa2}")
print(max(S1)) # Значение наибольшего элемента в массиве
print(min(S1)) # Значение наименьшего элемента в массиве
summa = 0
for i in S1:
if i < 30:
summa += i
print(f"Сумма чисел меньше 30-ти = {summa}")
summa = S1[2]
for i in S1:
summa *= i
print(f"Произведение элементов с индексов 2({S1[2]}) = {summa}")