Задания
Версия для печати и копирования в MS Word

В тек­сто­вом файле за­пи­сан набор на­ту­раль­ных чисел, не пре­вы­ша­ю­щих 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.

 

Ответ:

Спрятать решение

Ре­ше­ние.

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


Аналоги к заданию № 35485: 35916 Все

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