Решение. Заметим, что сумма трёх чисел будет делиться на 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]))