Задания
Версия для печати и копирования в 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") # для файла A ука­жи­те его на­зва­ние

s = f.readlines()

n = int(s[0])

maxi = 0

max_0 = 0

max_2 = 0

max_7 = 0

max_14 = 0

count = []

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

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

if s[i] % 14 == 0:

max_14 = max(max_14, s[i])

count.append(max_14)

elif s[i] % 7 == 0:

max_7 = max(max_7, s[i])

elif max_2 % 2 == 0:

max_2 = max(max_2, s[i])

else:

max_0 = max(max_0, s[i])

if count[0] == count [1]:

maxi = max_14**2

else:

maxi = max(max_14 * max(max_7, max_0, max_2), max_7 * max_2)

print(maxi)

 

При­ведём ре­ше­ние Ивана Шу­би­на на языке Java.

import java.io.BufferedReader;

import java.io.FileReader;

import java.util.ArrayList;

import java.util.Comparator;

import java.util.List;

public class EGE {

public static void main(String[] args) throws Throwable {

BufferedReader reader = new BufferedReader(new FileReader("27-B_2.txt"));

int n = Integer.parseInt(reader.readLine());

List<Integer> list = new ArrayList<>(n);

for (int i = 0; i < n; i++) {

list.add(Integer.parseInt(reader.readLine()));

}

list.sort(Comparator.reverseOrder());

for (int i = 0; i < n; i++) {

for (int j = 0; j < n; j++) {

if (i == j) continue;

int a = list.get(i);

int b = list.get(j);

int m = a * b;

if (m % 14 == 0) {

System.out.println(m);

 

return;

}

}

}

}

}

 

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

f = open('27-B_2.txt') # от­кры­ва­ем файл

a = [int(line) for line in f] # создаём спи­сок, i-ый эле­мент ко­то­ро­го яв­ля­ет­ся чис­лом, по­лу­чен­ным из i-ой стро­ки

count = a.pop(0) # уби­ра­ем из спис­ка пер­вое число, обо­зна­ча­ю­щее ко­ли­че­ство эле­мен­тов в нём (но за­по­ми­ная его)

a.sort(reverse=True) # сор­ти­ру­ем спи­сок по убы­ва­нию

for i in range(count):

for j in range(count):

if i == j: # ис­хо­дя из усло­вия нам под­хо­дят толь­ко раз­ные (i, j)

continue

m = a[i] * a[j]

if m % 14 == 0:

# так как спи­сок от­сор­ти­ро­ван, про­из­ве­де­ние пер­вой удо­вле­тво­ря­ю­щей пары и будет мак­си­маль­ным

print(m)

exit(0)

 

При­ведём ре­ше­ние Юрия Лы­са­ко­ва на языке 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))

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