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

По­сле­до­ва­тель­ность на­ту­раль­ных чисел ха­рак­те­ри­зу­ет­ся чис­лом Х  — наи­боль­шим чис­лом, крат­ным 14 и яв­ля­ю­щим­ся про­из­ве­де­ни­ем двух эле­мен­тов по­сле­до­ва­тель­но­сти с раз­лич­ны­ми но­ме­ра­ми. Га­ран­ти­ру­ет­ся, что хотя бы одно такое про­из­ве­де­ние в по­сле­до­ва­тель­но­сти есть.

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

Файл A

Файл B

Даны два вход­ных файла (файл A и файл B), каж­дый из ко­то­рых со­дер­жит в пер­вой стро­ке ко­ли­че­ство чисел N (1 ≤ N ≤ 100 000). В каж­дой из по­сле­ду­ю­щих N строк за­пи­са­но одно на­ту­раль­ное число, не пре­вы­ша­ю­щее 1000.

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

5

40

1000

7

28

55

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

28000 В от­ве­те ука­жи­те два числа: сна­ча­ла зна­че­ние ис­ко­мо­го про­из­ве­де­ния для файла А, затем для файла B.

 

Ответ:

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

Ре­ше­ние.

Про­из­ве­де­ние двух чисел де­лит­ся на 14, если:

—  либо один из со­мно­жи­те­лей де­лит­ся на 14 (вто­рой может быть любым),

—  либо ни один из со­мно­жи­те­лей не де­лит­ся на 14, но один из со­мно­жи­те­лей де­лит­ся на 7, а дру­гой  — на 2.

По­это­му про­грам­ма, вы­чис­ля­ю­щая число X, может ра­бо­тать так.

Про­грам­ма чи­та­ет все вход­ные дан­ные один раз, не за­по­ми­ная все дан­ные в мас­си­ве. Про­грам­ма для про­чи­тан­но­го фраг­мен­та вход­ной по­сле­до­ва­тель­но­сти хра­нит зна­че­ния четырёх ве­ли­чин:

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

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

3)  M14  — самое боль­шое число, крат­ное 14;

4)  МAX  — самое боль­шое число среди всех эле­мен­тов по­сле­до­ва­тель­но­сти, от­лич­ное от М14 (если число М14 встре­ти­лось более од­но­го раза и оно же яв­ля­ет­ся мак­си­маль­ным, то MAX  =  M14).

После того как все дан­ные про­чи­та­ны, ис­ко­мое число X вы­чис­ля­ет­ся как мак­си­мум из про­из­ве­де­ний М14 · MAX и М7 · М2.

Ниже при­ведён при­мер про­грам­мы на языке Пас­каль, ко­то­рая ре­а­ли­зу­ет опи­сан­ный ал­го­ритм.

 

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

var M7,M2,M14,MAX,dat,res,i,N: longint; var s: string;

begin

M7 := 0;

M2 := 0;

M14 := 0;

MAX := 0;

assign(input, '27-B_2.txt');

readln(N);

for i := 1 to N do

begin

readln(dat);

if ((dat mod 7) = 0) and ((dat mod 2) > 0) and (dat > M7) then

M7 := dat;

if ((dat mod 2) = 0) and ((dat mod 7) > 0) and (dat > M2) then

M2 := dat;

if (dat mod 14 = 0) and (dat > M14) then

begin

if M14 > MAX then MAX := M14;

M14 := dat

end

else

if dat > MAX then

MAX := dat;

end;

if (M7*M2 < M14*MAX) then

res := M14*MAX

else

res := M7*M2;

writeln(res);

end.

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

 

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

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

 

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

f = open('27-B_2.txt')

f.readline()

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

a.sort()

a = a[::-1]

max1 = 0

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

if a[i]*a[i+1] < max1: break

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

if (a[i]*a[j]) % 14 == 0:

max1 = max(max1,a[i]*a[j])

print(max1)

 

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

f = open('27-A_2.txt')

n = int(f.readline())

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

m2 = [0]

m7 = [0]

m14 = [0]

ma = max(m)

for i in range(n):

if m[i]%14 == 0 and m[i]!= ma:

m14.append(m[i])

elif m[i]%7 == 0:

m7.append(m[i])

elif m[i]%2 == 0:

m2.append(m[i])

print(max(max(m2)*max(m7),max(m14)*ma))

 

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

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

m2 = [x for x in a if x%2 == 0 and x%7 !=0 ]

m7 = [x for x in a if x%7 == 0 and x%2 !=0 ]

m14 = [x for x in a if x%14 == 0]

if m14:

a.remove(max(m14))

ans1 = max(m2)*max(m7) if m2 and m7 else 0

ans2 = max(m14)*max(a) if m14 else 0

print(max(ans1,ans2))

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