Задание №27 ЕГЭ Информатика с ответом и решением
Ответ: 447552 994000
Условие
Последовательность натуральных чисел характеризуется числом Х — наибольшим числом, кратным 14 и являющимся произведением двух элементов последовательности с различными номерами. Гарантируется, что хотя бы одно такое произведение в последовательности есть.
Входные данные.
Файл A
Файл B
Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 100 000). В каждой из последующих N строк записано одно натуральное число, не превышающее 1000.
Пример организации исходных данных во входном файле:
5
40
1000
7
28
55
Пример выходных данных для приведённого выше примера входных данных:
28000 В ответе укажите два числа: сначала значение искомого произведения для файла А, затем для файла B.
Подсказки — как подойти к решению
- Решение должно быть однопроходным: количество чисел велико, поэтому не храни всю последовательность, а запоминай только несколько лучших представителей каждого типа.
- Произведение делится на 14 не только тогда, когда один из сомножителей делится на 14. Разбери случаи по делимости сомножителей на 2 и на 7 и реши, какие именно максимумы тебе нужны, помня, что номера элементов пары должны быть разными.
- В конце сравни несколько произведений, составленных из найденных лучших чисел, и выбери наибольшее. Проверь, что в произведении не участвует один и тот же элемент, взятый дважды.
Решение
Произведение двух чисел делится на 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));
Типичные ошибки
- Файлы перепутаны местами: первым в ответе идёт значение для файла A, вторым — для файла B.
- Оба числа одинаковы — значит, при обработке второго файла остался путь к первому. Проверь имя файла в каждом запуске программы.
В тренажёре: подсказки по шагам, разбор твоей ошибки ИИ-репетитором (он не даёт готовый ответ), повторение ошибок по интервалам и общий прогресс. Все задания №27 по информатике