Задание №27 ЕГЭ Информатика с ответом и решением
Ответ: 2697 299986167
Условие
В текстовом файле записан набор натуральных чисел, не превышающих 108. Гарантируется, что все числа различны. Из набора нужно выбрать три числа, сумма которых делится на 3. Какую наибольшую сумму можно при этом получить?
Входные данные.
Файл A
Файл B
Первая строка входного файла содержит целое число N — общее количество чисел в наборе. Каждая из следующих N строк содержит одно число.
Пример входного файла:
4
5
8
14
11 В данном случае есть четыре подходящие тройки: 5, 8, 11 (сумма 24); 5, 8 14 (сумма 27); 5, 14 11 (сумма 30) и 8, 14, 11 (сумма 33). В ответе надо записать число 33.
Вам даны два входных файла (A и B), каждый из которых имеет описанную выше структуру. В ответе укажите два числа: сначала значение искомой суммы для файла A, затем для файла B.
Подсказки — как подойти к решению
- Сумма трёх чисел делится на три в двух случаях: остатки у всех трёх одинаковые или у всех трёх разные. Разбери оба случая и выбери лучший.
- Храни по три самых больших числа для каждого остатка: одного-двух не хватит для случая разных остатков. В ответе два числа — суммы для файлов A и B по отдельности.
Решение
Заметим, что сумма трёх чисел будет делиться на 3 в четырёх случаях: если каждое из трёх чисел при делении на 3 даёт остаток 0; если каждое из трёх чисел при делении на 3 даёт остаток 1; если каждое из трёх чисел при делении на 3 даёт остаток 2; если одно из чисел при делении на 3 даёт остаток 0, второе число при делении на 3 даёт остаток 1, а третье число при делении на 3 даёт остаток 2. Для всех четырёх случаев объявим переменные sum0, sum1, sum2 и sum12 соответственно. Будем последовательно считывать числа из файла, находя три наибольших числа, дающих при делении на 3 остаток 0, три наибольших числа, дающих при делении на 3 остаток 1, и три наибольших числа, дающих при делении на 3 остаток 2. Для этого объявим три массива из трёх элементов — m0, m1 и m2. В переменную sum0 запишем сумму элементов массива m0, в переменную sum1 запишем сумму элементов массива m1, в переменную sum2 запишем сумму элементов массива m2, в переменную sum12 запишем сумму первых элементов массивов m0, m1 и m2. Далее на экран будем выведем наибольшую из найденных сумм.
Приведём решение задачи на языке Pascal.
var
n, i, x, sum0, sum1, sum2, sum12: integer;
m0: array[1..3] of integer;
m1: array[1..3] of integer;
m2: array[1..3] of integer;
f: text;
begin
assign(f,'C:\27-B.txt');
reset(f);
readln(f, n);
for i := 1 to 3 do begin
m0[i] := 0;
m1[i] := 0;
m2[i] := 0;
end;
for i := 1 to n do begin
readln(f, x);
if x mod 3 = 0 then begin
if x > m0[1] then begin
m0[3] := m0[2];
m0[2] := m0[1];
m0[1] := x;
end
else if x > m0[2] then begin
m0[3] := m0[2];
m0[2] := x;
end
else if x > m0[3] then m0[3] := x;
end
else if x mod 3 = 1 then begin
if x > m1[1] then begin
m1[3] := m1[2];
m1[2] := m1[1];
m1[1] := x;
end
else if x > m1[2] then begin
m1[3] := m1[2];
m1[2] := x;
end
else if x > m1[3] then m1[3] := x;
end
else if x mod 3 = 2 then begin
if x > m2[1] then begin
m2[3] := m2[2];
m2[2] := m2[1];
m2[1] := x;
end
else if x > m2[2] then begin
m2[3] := m2[2];
m2[2] := x;
end
else if x > m2[3] then m2[3] := x;
end;
end;
sum0 := m0[1] + m0[2] + m0[3];
sum1 := m1[1] + m1[2] + m1[3];
sum2 := m2[1] + m2[2] + m2[3];
sum12 := m0[1] + m1[1] + m2[1];
if (sum0 > sum1) and (sum0 > sum2) and (sum0 > sum12) then writeln(sum0)
else if (sum1 > sum0) and (sum1 > sum2) and (sum1 > sum12) then writeln(sum1)
else if (sum2 > sum1) and (sum2 > sum0) and (sum2 > sum12) then writeln(sum2)
else writeln(sum12);
end.
В результате работы данного алгоритма при вводе данных из файла A ответ — 2697, из файла B — 299986167.
Примечание.
Путь к файлу необходимо указать согласно расположению файла на Вашем компьютере.
Приведём другое решение на языке Python.
f = open("27-B (4).txt")
s = f.readlines()
n = int(s[0])
m0 = [1 for i in range(4)]
m1 = [1 for i in range(4)]
m2 = [1 for i in range(4)]
for i in range(1, 4):
m0[i] = 0
m1[i] = 0
m2[i] = 0
for i in range(1, n + 1):
x = int(s[i])
if x % 3 == 0:
if x > m0[1]:
m0[3] = m0[2]
m0[2] = m0[1]
m0[1] = x
elif x > m0[2]:
m0[3] = m0[2]
m0[2] = x
elif x > m0[3]: m0[3] = x
elif x % 3 == 1:
if x > m1[1]:
m1[3] = m1[2]
m1[2] = m1[1]
m1[1] = x
elif x > m1[2]:
m1[3] = m1[2]
m1[2] = x
elif x > m1[3]: m1[3] = x
elif x % 3 == 2:
if x > m2[1]:
m2[3] = m2[2]
m2[2] = m2[1]
m2[1] = x
elif x > m2[2]:
m2[3] = m2[2]
m2[2] = x
elif x > m2[3]: m2[3] = x
sum0 = m0[1] + m0[2] + m0[3]
sum1 = m1[1] + m1[2] + m1[3]
sum2 = m2[1] + m2[2] + m2[3]
sum12 = m0[1] + m1[1] + m2[1]
if (sum0 > sum1) and (sum0 > sum2) and (sum0 > sum12): print(sum0)
elif (sum1 > sum0) and (sum1 > sum2) and (sum1 > sum12): print(sum1)
elif (sum2 > sum1) and (sum2 > sum0) and (sum2 > sum12): print(sum2)
else: print(sum12)
Приведём решение Королихина Валерия на языке Python.
f = open('27-B.txt')
n = int(f.readline())
a = list(map(int, f.readlines()))
a.sort()
b_0 = [i for i in a if i % 3 == 0][-3:]
b_1 = [i for i in a if i % 3 == 1][-3:]
b_2 = [i for i in a if i % 3 == 2][-3:]
print(max(sum(b_0), sum(b_1), sum(b_2), b_1[-1] + b_2[-1] + b_0[-1]))
Приведём решение Зиновьева Ивана на языке Python.
files=["27-A.txt","27-B.txt"]
for file in files:
with open(file) as f:
n=f.readline()
lst1=[0]*100
lst2=[0]*100
lst3=[0]*100
lst=[]
for line in f:
line=int(line)
lst.append(line)
for line in lst:
line=int(line)
if line%3==0:
lst1.append(line)
elif line%3==1:
lst2.append(line)
elif line%3==2:
lst3.append(line)
lst1.sort()
lst2.sort()
lst3.sort()
lst1=lst1[-3: :]
lst2=lst2[-3: :]
lst3=lst3[-3: :]
print(max(sum(lst1),sum(lst2),sum(lst3),lst1[-1]+lst2[-1]+lst3[-1]))
Приведём решение Константина Мышак на языке Python.
f = open('27-A.txt')
n = int(f.readline())
s = [int(i) for i in f]
m = [0]*3
mx = [0]*3
mX = 0
for i in range(n-2):
m[s[i] % 3] = max(m[s[i] % 3], s[i])
for j in range(3):
mx[(s[i+1]+m[j]) % 3] = max(mx[(s[i+1]+m[j]) % 3], s[i+1]+m[j])
mX = max(s[i+2]+mx[(3 - s[i+2] % 3) % 3], mX)
print(mX)
Приведём решение Юрия Лысакова на языке Python.
#Метод простого перебора ( можно увеличивать диапазон значений, пока не будет достигнуто постоянство ответа)
f = open('27-B.txt', 'r')
n = [int(i) for i in f]
n1=[]
n.sort(reverse=True)
for i1 in range (100):
for i2 in range(i1+1,101):
for i3 in range(i2+1,102):
if (n[i1]+n[i2]+n[i3])%3==0:
n1.append(n[i1]+n[i2]+n[i3])
print(max(n1))
Приведём решение Юрия Красильникова на языке Python.
a = sorted([int(s) for s in open('27-B.txt')][1:],reverse=True)
b = [[],[],[]]
for x in a: b[x%3].append(x)
print(max(sum(b[0][:3]),sum(b[1][:3]),sum(b[2][:3]),b[0][0]+b[1][0]+b[2][0]))
Типичные ошибки
- Итоговая сумма не делится на три: в тройку попали числа с неподходящими остатками. Проверяй остаток суммы, а не только размер выбранных чисел.
В тренажёре: подсказки по шагам, разбор твоей ошибки ИИ-репетитором (он не даёт готовый ответ), повторение ошибок по интервалам и общий прогресс. Все задания №27 по информатике