Задание выполняется с использованием прилагаемых файлов
В текстовом файле записан набор натуральных чисел, не превышающих Гарантируется, что все числа различны. Необходимо определить, сколько в наборе таких пар чисел, где оба числа являются полными квадратами, их сумма тоже присутствует в файле, и чему равна наибольшая из сумм таких пар.
Входные данные.
Первая строка входного файла содержит целое число — общее количество чисел в наборе. Каждая из следующих
строк содержит одно число. В ответе запишите два целых числа: сначала количество пар, затем наибольшую сумму.
Под парой подразумевается любые два различные элемента последовательности.
Пример входных данных:
В данном случае есть одна подходящая пара: и
(сумма
).
В ответе надо записать числа и
.
Решение через бин. поиск
def bin_search(a, x):
n = len(a)
left = -1
right = n
while right - left > 1:
middle = (left + right) // 2
if a[middle] >= x:
right = middle
else:
left = middle
if right != n and a[right] == x:
return True
else:
return False
f = open(’1.txt’)
n = int(f.readline())
a = []
counter = 0
max_summ = 0
for i in range(n):
a.append(int(f.readline()))
a = sorted(list(set(a))) # Уменьшаем количество элементов до уникальных
for i in range(len(a)):
for j in range(i+1, len(a)):
if a[i] ** 0.5 == int(a[i] ** 0.5) and a[j] ** 0.5 == int(a[j] ** 0.5):
if bin_search(a, a[i] + a[j]):
counter += 1
max_summ = max(max_summ, a[i] + a[j])
print(counter, max_summ)
Решение через поиск по множеству
f = open(’1.txt’)
n = int(f.readline())
a = []
counter = 0
max_summ = 0
for i in range(n):
a.append(int(f.readline()))
b = set(a) # Уменьшаем количество элементов до уникальных
for i in range(len(a)):
for j in range(i+1, len(a)):
if a[i]**0.5 == int(a[i]**0.5) and a[j]**0.5 == int(a[j]**0.5):
if (a[i] + a[j]) in b:
counter += 1
max_summ = max(max_summ, a[i] + a[j])
print(counter, max_summ)