Задания
Версия для печати и копирования в MS Word

Дана по­сле­до­ва­тель­ность N целых по­ло­жи­тель­ных чисел. Рас­смат­ри­ва­ют­ся все пары эле­мен­тов по­сле­до­ва­тель­но­сти, раз­ность ко­то­рых чётна, и в этих парах, по край­ней мере, одно из чисел пары де­лит­ся на 17. По­ря­док эле­мен­тов в паре не­ва­жен. Среди всех таких пар нужно найти и вы­ве­сти пару с мак­си­маль­ной сум­мой эле­мен­тов. Если оди­на­ко­вую мак­си­маль­ную сумму имеет не­сколь­ко пар, можно вы­ве­сти любую из них. Если под­хо­дя­щих пар в по­сле­до­ва­тель­но­сти нет, нужно вы­ве­сти два нуля.

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

Файл A

Файл B

В пер­вой стро­ке вход­ных дан­ных задаётся ко­ли­че­ство чисел N (2 ≤ N ≤ 10 000). В каж­дой из по­сле­ду­ю­щих N строк за­пи­са­но одно на­ту­раль­ное число, не пре­вы­ша­ю­щее 10 000.

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

5

34

12

51

52

51

При­мер вы­ход­ных дан­ных для при­ведённого выше при­ме­ра вход­ных дан­ных:

51 51 В от­ве­те ука­жи­те че­ты­ре числа: сна­ча­ла зна­че­ние ис­ко­мой пары для файла А (два числа через про­бел), затем для файла B (два числа через про­бел). Числа пар впи­ши­те в по­ряд­ке убы­ва­ния.

 

Ответ:

 

По­яс­не­ние. Из дан­ных пяти чисел можно со­ста­вить три раз­лич­ные пары, удо­вле­тво­ря­ю­щие усло­вию: (34, 12), (34, 52), (51, 51). Наи­боль­шая сумма по­лу­ча­ет­ся в паре (51, 51). Эта пара до­пу­сти­ма, так как число 51 встре­ча­ет­ся в ис­ход­ной по­сле­до­ва­тель­но­сти два­жды.

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

Ре­ше­ние.

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

var

N: integer;

a: integer;

i: integer;

max: array [0..1] of integer;

max17: array [0..1] of integer;

f: text;

begin

max[0] := 0;

max[1] := 0;

max17[0] := 0;

max17[1] := 0;

assign(f,'27991_A.txt');

reset(f);

readln(f, n);

for i := 1 to n do begin

readln(f, a);

if (a mod 17 = 0) and (a mod 2 = 0) and (a >= max17[0]) then begin

if max17[0] > max[0] then max[0] := max17[0];

max17[0] := a;

end

else if (a mod 17 = 0) and (a mod 2 = 1) and (a >= max17[1]) then begin

if max17[1] > max[1] then max[1] := max17[1];

max17[1] := a;

end

else if (a mod 17 > 0) and (a mod 2 = 0) and (a > max[0]) then max[0] := a

else if (a mod 17 > 0) and (a mod 2 = 1) and (a > max[1]) then max[1] := a;

end;

if (max[0] = 0) or (max17[0] = 0) then begin

max[0] := 0;

max17[0] := 0;

end;

if (max[1] = 0) or (max17[1] = 0) then begin

max[1] := 0;

max17[1] := 0;

end;

if (max[0] + max17[0]) > (max[1] + max17[1]) then begin

if max[0] > max17[0] then writeln(max[0], ' ', max17[0])

else writeln(max17[0], ' ', max[0])

end

else then begin

if max[1] > max17[1] then writeln(max[1], ' ', max17[1])

else writeln(max17[1], ' ', max[1])

end;

end.

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла A ответ  — 8759 3077, из файла B  — 10000 9996.

 

При­ме­ча­ние.

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

 

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

var

nums: array [0..3] of integer;

n, ctg, p1, p2, i, x, second: integer;

f: text;

begin

assign(f,'27991_B.txt');

reset(f);

readln(f, n);

p1 := 0; p2 := 0;

for i := 0 to 3 do nums[i] := 0;

for i := 1 to n do begin

readln(f, x);

ctg := x mod 2;

if (x mod 17) = 0 then ctg := ctg+2;

if ctg > 1 then second := nums[ctg-2]

else if nums[ctg] > nums[ctg+2] then second := nums[ctg] else second := nums[ctg+2];

if (second>0) and (x+second > p1+p2) then

begin

p1 := x; p2 := second

end;

if x > nums[ctg] then nums[ctg] := x

end;

if p1 > p2 then writeln(p1,' ',p2) else writeln(p2,' ',p1)

end.

 

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

f = open("27991_B.txt") # для файла A ука­жи­те его на­зва­ние

s = f.readlines()

n = int(s[0])

max_ch = 0

max_n = 0

max_ch17 = 0

max_n17 = 0

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

s[i] = int(s[i])

if s[i] % 2 == 0:

if s[i] % 17 == 0 and s[i] > max_ch17:

max_ch17 = s[i]

elif s[i] % 17 == 0 and s[i] <= max_ch17: # поиск вто­ро­го мак­си­му­ма

if s[i] > max_ch:

max_ch = s[i]

elif s[i] > max_ch:

max_ch = s[i]

elif s[i] % 2 != 0:

if s[i] % 17 == 0 and s[i] > max_n17:

max_n17 = s[i]

elif s[i] % 17 == 0 and s[i] <= max_n17:

if s[i] > max_n:

max_n = s[i]

elif s[i] > max_n:

max_n = s[i]

if max_n17 + max_n == 0 and max_ch17 + max_ch == 0:

print(0, 0)

elif max_n17 + max_n > max_ch17 + max_ch:

print(max_n17, max_n)

else:

print(max_ch17, max_ch)

 

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

f = open('27991_A.txt')

n = int(f.readline())

nums = [0]*4 # мак­си­маль­ное число в каж­дой из ка­те­го­рий (см. ниже)

pair = [0,0] # наи­луч­шая пара

for s in f:

x=int(s)

ctg = (x%17!=0)*2 + x % 2 # ctg - ка­те­го­рия (0-3):

# 0 - чет­ное, де­лит­ся на 17; 2 - чет­ное, не де­лит­ся на 17;

# 1 - не­чет­ное, де­лит­ся на 17; 3 - не­чет­ное, не де­лит­ся на 17;

second = max(nums[ctg],nums[ctg+2]) if ctg < 2 else nums[ctg-2]

if second > 0 and x + second > sum(pair):

pair = sorted([x,second],reverse=True)

nums[ctg] = max(nums[ctg],x)

print(*pair)

 

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

def func(x, y):

if len(x)>=2:

for i in y:

if (x[0]+i)%2==0 and (x[0]+i)>(x[0]+x[1]):

return (i, x[0])

elif (x[0]+i)<(x[0]+x[1]):

return (x[0], x[1])

elif len(x)==1:

for i in y:

if (x[0]+i)%2==0:

return (i, x[0])

with open("27991_B.txt") as f:

sp = sorted(map(int, f.readlines()[1:]),reverse=True)

sp_17 = [i for i in sp if i%17==0]

sp.sort(key=lambda x: x%17==0)

print(sp[:10], sp_17[:10])

print(func(sp_17, sp))

 

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

file = open('27991_A.txt')

a = sorted([int(i) for i in file][1:], reverse=True)

flag = True

for j in range(len(a)):

m = a[j]

for i in range(1, len(a)):

if (a[i] % 17) == 0 and (a[i] - m) % 2 == 0:

print(m, a[i])

flag = False

break

if flag == False:

break

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