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

На вход про­грам­мы по­сту­па­ет по­сле­до­ва­тель­ность из N целых по­ло­жи­тель­ных чисел. Рас­смат­ри­ва­ют­ся все пары раз­лич­ных эле­мен­тов по­сле­до­ва­тель­но­сти (эле­мен­ты пары не обя­за­ны сто­ять в по­сле­до­ва­тель­но­сти рядом), такие, что ai > aj при i < j ≤ N. Среди пар, удо­вле­тво­ря­ю­щих этому усло­вию, не­об­хо­ди­мо найти и вы­ве­сти пару с мак­си­маль­ной сум­мой эле­мен­тов, ко­то­рая де­лит­ся на 120. Если среди най­ден­ных пар мак­си­маль­ную сумму имеют не­сколь­ко, то можно на­пе­ча­тать любую из них. Если пар за­дан­ным усло­ви­ем нет, то про­грам­ма долж­на вы­ве­сти 00.

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

Файл A

Файл B

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

В ка­че­стве ре­зуль­та­та про­грам­ма долж­на на­пе­ча­тать эле­мен­ты ис­ко­мой пары. Если таких пар не­сколь­ко, можно вы­ве­сти любую из них.

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

7

1

119

2

118

3

237

123

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

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

 

Ответ:

 

По­яс­не­ние. Из 7 чисел можно со­ста­вить 14 пар. В дан­ном слу­чае усло­ви­ям удо­вле­тво­ря­ет пара: 237 и 123. Сумма 360 де­лит­ся на 120, ai > aj, а i < j. У всех осталь­ных пар как ми­ни­мум одно из этих усло­вий не вы­пол­ня­ет­ся.

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

Ре­ше­ние.

За­ме­тим, что сумма двух эле­мен­тов крат­на 120 тогда, когда сумма их остат­ков от де­ле­ния на 120 будет равна 120 (или равна 0, если оба числа крат­ны 120). Не­об­хо­ди­мо хра­нить в мас­си­ве мак­си­маль­ные числа с остат­ка­ми от 0 до 119, а каж­дое новое введённое число скла­ды­вать с чис­ла­ми из мас­си­ва и ис­кать наи­боль­шую сумму, крат­ную 120.

 

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

var

a: array[0..119] of integer;

i, j, n, x, t, n1, n2: integer;

f: text;

begin

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

reset(f);

readln(f, n);

for i := 0 to 119 do

a[i] := 0;

n1 := 0;

n2 := 0;

for i := 1 to n do begin

readln(f, x);

t := x mod 120;

if t = 0 then t := 120;

if (a[120-t] > x) and (a[120-t] + x > n1 + n2) then begin

n1 := a[120-t];

n2 := x;

end;

if t < 120 then begin

if a[t] < x then a[t] := x;

end

else if (x > a[0]) then

a[0] := x;

end;

if n1 + n2 <> 0 then writeln(n1, ' ', n2)

else writeln('00');

end.

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла A ответ  — 00, из файла B  — 9991 9689 или 9971 9709.

 

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

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

 

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

def f(x,dict):

for key,keybord in dict.items():

if key==x:

return keybord

 

g=open('27.txt')

n=int(g.readline())

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

i=0

dict={}

k=0

maxk=0

while i!=n:

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

if ((numbers[h]+numbers[i]) % 120 ==0) and (numbers[h] < numbers[i]) and (numbers.index(numbers[h]) > numbers.index(numbers[i])):

dict[numbers[h]+numbers[i]]=numbers[i],numbers[h]

k=numbers[h]+numbers[i]

maxk=max(k,maxk)

i=i+1

if maxk==0:

print('00')

else:print('Мак­си­маль­ная сумма:',maxk,'.Ис­ко­мые эле­мен­ты:',f(maxk,dict))

 

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

f = open('28133_B.txt')

n=int(f.readline())

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

x = 0

y = 0

max_xy = 0

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

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

if(a[i]+a[k])%120==0 and max_xy < a[i]+a[k] and a[i] > a[k]:

x =a[i]

y = a[k]

max_xy=a[i]+a[k]

print(x,y)


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

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