πЕГЭ · ИИ-репетитор12 предметов · задания ФИПИ
Главная → Информатика → Задания №27 → Задание i27-02

Задание №27 ЕГЭ Информатика с ответом и решением

Ответ: 447552 994000

Условие

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

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

Файл A

Файл B

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

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

5

40

1000

7

28

55

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

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

Файл с исходными данными к этому заданию в открытом банке не опубликован — разбирай подход по официальному решению ниже.

Подсказки — как подойти к решению

  1. Решение должно быть однопроходным: количество чисел велико, поэтому не храни всю последовательность, а запоминай только несколько лучших представителей каждого типа.
  2. Произведение делится на 14 не только тогда, когда один из сомножителей делится на 14. Разбери случаи по делимости сомножителей на 2 и на 7 и реши, какие именно максимумы тебе нужны, помня, что номера элементов пары должны быть разными.
  3. В конце сравни несколько произведений, составленных из найденных лучших чисел, и выбери наибольшее. Проверь, что в произведении не участвует один и тот же элемент, взятый дважды.

Решение

Произведение двух чисел делится на 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)

-->

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

Приведём решение Игоря Орлова на PascalABC.NET:

//

{* Решение на языке PascalABC.Net

Решение для части А, читаем файл, разбиваем попарно, перемножаем, находим кратное 14.

Для файла B, решение получаем в течение получаса.

Решение для файла B:

Читаеmь все входные данные один раз,

Находим значения четырёх величин:

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

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

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

4) МAX  — самое большое число среди всех элементов последовательности, отличное от М14

(если число М14 встретилось более одного раза и оно же является максимальным, то MAX  =  M14).

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

P.S. Не забываем удалить первый элеент файла, он не относится к данным.

*}

#ReadAlllines('a.txt').Skip(1).select(x->x.tobiginteger).Combinations(2).Select(x->x.product).Where(x->((x mod 14)=0)).max.print;

var m:=ReadAlllines('b.txt').skip(1).select(x->x.tointeger);

var m7:=m.Where(x->((x mod 7)=0) and ((x mod 2)<>0)).max;

var m2:=m.Where(x->((x mod 2)=0) and ((x mod 7)<>0)).max;

var m14:=m.Where(x->((x mod 14)=0)).max;

var count1:=m.Where(x->x=m14).count;

var max1:=m.Where(x->(x<>m14)).max;

if (count1 >1) and (m14=max1) then max1:=m14;

print(max(m14*max1,m7*m2));

Типичные ошибки

Решить это задание в тренажёре

В тренажёре: подсказки по шагам, разбор твоей ошибки ИИ-репетитором (он не даёт готовый ответ), повторение ошибок по интервалам и общий прогресс. Все задания №27 по информатике