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

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

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

За­да­ние 26

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

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

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

6

9

10

14

13

8

11 В дан­ном слу­чае есть две под­хо­дя­щие пары: 9 и 13 (сред­нее ариф­ме­ти­че­ское 11), 9 и 11 (сред­нее ариф­ме­ти­че­ское 10). В от­ве­те надо за­пи­сать числа 2 и 11.

 

Ответ:

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

Ре­ше­ние.

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

 

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

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

var

n, i, j, t, sredn, count, maxSredn: 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:\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;

maxSredn := 0;

for i := 1 to n - 1 do begin

if (arr[i] mod 2 <> 0) then

for j := i + 1 to n do begin

if (arr[j] mod 2 <> 0) then begin

sredn := (arr[i] + arr[j]) div 2;

if binSearch(i, j, sredn, arr) then begin

count := count + 1;

if sredn > maxSredn then maxSredn := sredn;

end;

end;

end;

end;

writeln(count, ' ', maxSredn);

end.

 

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

 

Ответ: 14 679730035.

 

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

with open('26.txt') as f:

kol = f.readline()

numbers=[int(x) for x in f]

numbers4=[int(x) for x in numbers if int(x)%2!=0]

i=0

k=0

sr=0

maxsr=0

while i != len(numbers4):

for h in range(i+1,len(numbers4)):

if ((numbers4[i] + numbers4[h])//2) in numbers:

k=k+1

sr = ((numbers4[i] + numbers4[h])//2)

maxsr = max(sr,maxsr)

i=i+1

print(k,maxsr)

 

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

 

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

f = open('26.txt')

kol = f.readline()

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] % 2 != 0 and n[j] % 2 != 0:

s = (n[i] + n[j]) // 2

if s in ns:

c += 1

if s > m:

m = s

print(c, m)

 

 

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

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

sa = set(a)

odds = [x for x in a if x%2==1]

r = [(odds[i]+odds[j])//2 for i in range(len(odds)-1) for j in range(i+1,len(odds)) if ((odds[i]+odds[j])//2) in sa]

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


Аналоги к заданию № 35484: 35915 Все

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