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

На вход про­грам­мы по­сту­па­ет по­сле­до­ва­тель­ность из N на­ту­раль­ных чисел. Рас­смат­ри­ва­ют­ся все пары раз­лич­ных эле­мен­тов по­сле­до­ва­тель­но­сти, у ко­то­рых раз­лич­ные остат­ки от де­ле­ния на d  =  160 и хотя бы одно из чисел де­лит­ся на p  =  7. Среди таких пар не­об­хо­ди­мо найти и вы­ве­сти пару с мак­си­маль­ной сум­мой эле­мен­тов.

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

Файл A

Файл B

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

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

4

168

7

320

328

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

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

 

Ответ:

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

Ре­ше­ние.

От­ме­тим:

m71  — самое боль­шое число, крат­ное 7;

m72  — вто­рое по ве­ли­чи­не число, крат­ное 7, и оста­ток от де­ле­ния на 160 не равен остат­ку от де­ле­ния m71 на 160;

m1  — самое боль­шое число, не крат­ное 7;

m2  — вто­рое по ве­ли­чи­не число, не крат­ное 7, и оста­ток от де­ле­ния на 160 не равен остат­ку от де­ле­ния m71 на 160.

 

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

var

n, i, m71, m72, m1, m2, max1, max2, x: integer;

f: text;

begin

 

m71:=0;

m72:=0;

m1:=0;

m2:=0;

max1:=0;

max2:=0;

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

reset(f);

readln(f, N);

while not eof(f) do begin

readln(f, x);

if (x mod 7 = 0) and (x mod 160 = m71 mod 160) and (x > m71) then

m71 := x

else if (x mod 7 = 0) and (x mod 160 <> m71 mod 160) and (x > m71) then

begin

m72 := m71;

m71 := x;

end

else if (x mod 7 = 0) and (x mod 160 <> m71 mod 160) and (x > m72) then

m72 := x

else if (x mod 7 <> 0) and (x mod 160 = m1 mod 160) and (x > m1) then

m1 := x

else if (x mod 7 <> 0) and (x mod 160 <> m1 mod 160) and (x > m1) then

begin

m2 := m1;

m1 := x;

end

else if (x mod 7 <> 0) and (x mod 160 <> m1 mod 160) and (x > m2) then

m2 := x;

end;

if (m71 = 0) and (m72 = 0) then

writeln(0, ' ', 0)

else if (m72 = 0) and (m2 = 0) and (m71 mod 160 = m1 mod 160) then

writeln(0, ' ', 0)

else

begin

if (m71+m72)>(max1+max2) then

begin

max1 := m71;

max2 := m72;

end;

if ((m71+m1)>(max1+max2)) and (m71 mod 160 <> m1 mod 160) then

begin

max1 := m71;

max2 := m1;

end;

if ((m71+m2)>(max1+max2)) and (m71 mod 160 <> m2 mod 160) then

begin

max1 := m71;

max2 := m2;

end;

if (((m72 + m1) > (max1 + max2)) and ((m72 mod 160) <> (m1 mod 160))) then

begin

max1 := m72;

max2 := m1;

end;

writeln(max1, ' ', max2);

end;

end.

 

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

var

s, n, x, x1, k7, n7, t: integer;

a: array[0..159, 0..1] of integer;

f: text;

begin

for var j := 0 to 159 do

for var l := 0 to 1 do

a[j][l] := 0;

s := 0;

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

reset(f);

readln(f, n);

readln(f, x);

for var i := 2 to n do

begin

t := 1;

if x mod 7 = 0 then

t := 0;

if x >= a[x mod 160][t] then

a[x mod 160][t] := x;

readln(f, x);

for var k := 0 to 159 do

for var r := 0 to 1 do

if ((x + a[k][r]) > s) and (x mod 160 <> k) and

((x * a[k][r]) mod 7 = 0) then

begin

s := x + a[k][r];

x1 := x;

end;

end;

if s = 0 then

writeln('00')

else

if (s - x1) < x1 then writeln(s - x1, ' ', x1)

else writeln(x1, ' ', s - x1)

end.

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла A ответ  — 728 977, из файла B  — 9982 9992.

 

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

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

 

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

f = open("28129_B.txt")

s = f.readlines()

m71 = 0

m72 = 0

m1 = 0

m2 = 0

max1 = 0

max2 = 0

for i in range(len(s)):

x = int(s[i])

if x % 7 == 0 and x % 160 == m71 % 160 and x > m71:

m71 = x

elif x % 7 == 0 and x % 160 != m71 % 160 and x > m71:

m72 = m71

m71 = x

elif (x % 7 == 0) and (x % 160 != m71 % 160) and (x > m72):

m72 = x

elif x % 7 != 0 and x % 160 == m1 % 160 and x > m1:

m1 = x

elif x % 7 != 0 and x % 160 != m1 % 160 and x > m1:

m2 = m1

m1 = x

elif x % 7 != 0 and x % 160 != m1 % 160 and x > m2:

m2 = x

if m71 == 0 and m72 == 0:

print(0, 0)

elif (m72 == 0) and (m2 == 0) and (m71 % 160 == m1 % 160):

print(0, 0)

else:

if (m71 + m72) > (max1 + max2):

max1 = m71

max2 = m72

if ((m71 + m1) > (max1 + max2)) and (m71 % 160 != m1 % 160):

max1 = m71

max2 = m1

if ((m71+m2)>(max1+max2)) and (m71 % 160 != m2 % 160):

max1 = m71

max2 = m2

if (((m72 + m1) > (max1 + max2)) and ((m72 % 160) != (m1 % 160))):

max1 = m72

max2 = m1

print(max1, max2)

 

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

f = open('28129_B.txt')

f.readline()

s = 0

b1 = 0

b2 = 0

a = [int(i) for i in f]

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

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

if a[i] % 160 != a[j] % 160 and (a[i] % 7 == 0 or a[j] % 7 == 0):

if a[i] + a[j] > s:

s = a[i] + a[j]

b1 = a[i]

b2 = a[j]

print(b1,b2)

 

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

a = sorted([int(s) for s in open('28129_B.txt')][1:],reverse=True)

r=[[] for _ in range(160)]

for x in a: r[x%160].append(x) # рас­пре­де­ля­ем по остат­кам

ans = [[0,0]] # если не най­дем дру­гих ре­ше­ний

for i in range(160):

m7 = [x for x in r[i] if x%7==0]

if m7:

dop=[r[j][0] for j in range(160) if j!=i and r[j]]

if dop: ans.append(sorted([m7[0],max(dop)]))

print(*max(ans,key=lambda x: sum(x)))

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