Задания
Версия для печати и копирования в MS Word
Тип 26 № 36881
i

В тек­сто­вом файле за­пи­сан набор на­ту­раль­ных чисел, не пре­вы­ша­ю­щих 109. Га­ран­ти­ру­ет­ся, что все числа раз­лич­ны. Не­об­хо­ди­мо опре­де­лить, сколь­ко в на­бо­ре таких пар чисел, что числа в паре имеют оди­на­ко­вую чётность, а их сумма тоже при­сут­ству­ет в файле, и чему равна наи­боль­шая из сумм таких пар.

Вход­ные дан­ные.

За­да­ние 26

Пер­вая стро­ка вход­но­го файла со­дер­жит целое число N  — общее ко­ли­че­ство чисел в на­бо­ре. Каж­дая из сле­ду­ю­щих N строк со­дер­жит одно число.

В от­ве­те за­пи­ши­те два целых числа: сна­ча­ла ко­ли­че­ство пар, затем наи­боль­шую сумму.

При­мер вход­но­го файла:

6

3

8

14

11

22

17 В дан­ном слу­чае есть две под­хо­дя­щие пары: 3 и 11 (сумма 14), 8 и 14 (сумма 22). В от­ве­те надо за­пи­сать числа 2 и 22.

 

Ответ:

Спрятать решение

Ре­ше­ние.

Счи­та­ем числа из файла в мас­сив, после чего от­сор­ти­ру­ем его. Для по­ис­ка суммы двух чисел оди­на­ко­вой чётно­сти из мас­си­ва будем ис­поль­зо­вать би­нар­ный поиск. Для этого со­зда­дим спе­ци­аль­ную функ­цию, ко­то­рая будет воз­вра­щать зна­че­ние True, если в мас­си­ве будет най­де­но ис­ко­мое зна­че­ние. В этом слу­чае в пе­ре­мен­ной count будем на­кап­ли­вать еди­ни­цу. Также в пе­ре­мен­ную maxSum будем за­пи­сы­вать мак­си­маль­ное най­ден­ное зна­че­ние, удо­вле­тво­ря­ю­щее усло­ви­ям.

 

При­ведём ре­ше­ние на языке PascalABC.

type mt = array [1..5000] of integer;

var

n, i, j, t, sum, count, maxSum: integer;

arr: mt;

f: text;

function binSearch(left, right, num: integer; arr: mt):boolean;

var mid: integer;

begin

while right > left + 1 do begin

mid := (left + right) div 2;

if arr[mid] > num then right := mid

else if arr[mid] < num then left := mid

else begin

binSearch := true;

exit;

end;

end;

binSearch := false;

end;

begin

assign(f,'C:\inf_26_04_21_26.txt');

reset(f);

readln(f, n);

for i := 1 to n do readln(f, arr[i]);

for i := 1 to n do

for j := i + 1 to n do

if arr[i] > arr[j] then begin

t := arr[i];

arr[i] := arr[j];

arr[j] := t;

end;

count := 0;

maxSum := 0;

for i := 1 to n - 1 do begin

for j := i + 1 to n do begin

if ((arr[i] + arr[j]) mod 2 = 0) then begin

sum := arr[i] + arr[j];

if binSearch(i, n, sum, arr) then begin

count := count + 1;

if sum > maxSum then maxSum := sum;

end;

end;

end;

end;

writeln(count, ' ', maxSum);

end.

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла в усло­вии по­лу­ча­ем ответ  — 10 933100556.

 

Ответ: 10 933100556.

 

При­ме­ча­ние. Путь к файлу не­об­хо­ди­мо ука­зать со­глас­но рас­по­ло­же­нию файла на Вашем ком­пью­те­ре.

 

При­ведём дру­гое ре­ше­ние на языке Python.

f = open('inf_26_04_21_26.txt')

k = f.readlines()

n = list(map(int, k))

m = 0

s = 0

c = 0

ns = set(n)

for i in range(1, len(n) - 1):

for j in range(i + 1, len(n)):

if ((n[i] + n[j]) % 2 != 1):

s = n[i] + n[j]

if (s in ns):

c += 1

if s > m:

m = s

 

print(c, m)

 

При­ведём ре­ше­ние Юрия Лы­са­ко­ва на языке Python.

from itertools import combinations

f = open('inf_26_04_21_26.txt')

f.readline()

a = list(map(int,f))

c = set(a)

b = list(filter(lambda x: sum(x) % 2 == 0 and sum(x) in c, combinations(a,2)))

print(len(b), sum(max(b, key = lambda i: sum(i))))

 

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

a = [int(s) for s in open('inf_26_04_21_26.txt')][1:]

sa = set(a)

r = [a[i] + a[j] for i in range(len(a) - 1) for j in range(i + 1,len(a)) if a[i]%2 == a[j]%2 and (a[i] + a[j]) in sa]

print(len(r),max(r))

Раздел кодификатора ФИПИ: