Задания
Версия для печати и копирования в MS Word
Тип 27 № 64912
i

Дана по­сле­до­ва­тель­ность на­ту­раль­ных чисел. Не­об­хо­ди­мо вы­брать из по­сле­до­ва­тель­но­сти три числа так, чтобы их сумма де­ли­лась на 102 и при этом была мак­си­маль­но воз­мож­ной.

В от­ве­те за­пи­ши­те най­ден­ную сумму.

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

Файл A

Файл B

Пер­вая стро­ка вход­но­го файла со­дер­жит целое число N  — общее ко­ли­че­ство чисел в на­бо­ре. Каж­дая из сле­ду­ю­щих N строк со­дер­жит одно на­ту­раль­ное число, не пре­вы­ша­ю­щее 108.

Вам даны два вход­ных файла (A и B), каж­дый из ко­то­рых имеет опи­сан­ную выше струк­ту­ру. В от­ве­те ука­жи­те два числа: сна­ча­ла тре­бу­е­мую сумму для файла A, затем  — для файла B.

 

Ответ:

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

Ре­ше­ние.

При­ве­дем ре­ше­ние на языке Python для файла A.

f = open('27-A.txt')

n = int(f.readline())

a = [int(s) for s in f]

summi = []

for i in range(n):

for j in range(i+1, n):

for k in range(j+1,n):

summa = a[i] + a[j] + a[k]

if summa % 102 == 0:

summi.append(summa)

print(max(summi))

 

При­ве­дем ре­ше­ние на языке Python для фай­лов А и B.

f = open('27-B.txt')

n = int(f.readline())

a = [int(s) for s in f]

ost102 = [[-100000,-100000,-100000] for i in range(102)]

 

for i in a:

if i > min(ost102[i%102]):

ost102[i%102].append(i)

ost102[i%102].sort(reverse=True)

if len(ost102[i%102])>3:

del ost102[i%102][-1]

 

summa = -10**10

for x1 in range(102):

for x2 in range(102):

for x3 in range(102):

if (x1+x2+x3)%102 ==0:

if x1==x2==x3:

summa=max(sum(ost102[x1]),summa)

elif x1==x2:

summa=max(ost102[x3][0]+ost102[x1][0]+ost102[x1][1],summa)

elif x1==x3:

summa=max(ost102[x2][0]+ost102[x1][0]+ost102[x1][1],summa)

elif x2==x3:

summa=max(ost102[x1][0]+ost102[x2][0]+ost102[x2][1],summa)

else:

summa=max(ost102[x1][0]+ost102[x2][0]+ost102[x3][0],summa)

print(summa)

 

Ответ: 118728 & 299998014.

 

При­ве­дем ре­ше­ние Сер­гея Фе­фе­ло­ва на языке Python.

a = sorted([int(x) for x in open('27.txt')][1:] ,reverse=True)

r102 = [[-10**8]*3 for i in range(102)]

for x in a: r102[x%102].insert(-3,x)

smax = 0

for i in range(102):

for j in range(i,102):

k = (-i-j)%102

if k < j: continue

if i==k:

smax = max(sum(r102[i][:3]), smax)

elif i==j:

smax = max(r102[k][0]+r102[i][0]+r102[i][1], smax)

elif j==k:

smax = max(r102[i][0]+r102[j][0]+r102[j][1], smax)

else:

smax = max(r102[i][0]+r102[j][0]+r102[k][0], smax)

print(smax)

 

 

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

a = sorted([int(s) for s in open('27.txt')][1:],reverse=True)

p = [[] for _ in range(102)]

for x in a: p[x%102].append(x)

m = 0

for i in range(102):

for j in range(102):

ndx = [i,j,(-i-j)%102] # три ин­дек­са с сум­мой 0 по мо­ду­лю 102

vect = [(x,ndx.count(x)) for x in set(ndx)] # пары (ин­декс, число его по­вто­ре­ний)

if all([len(p[x[0]]) >= x[1] for x in vect]): # если все под­спис­ки в p имеют нуж­ную длину

m = max(m,sum(sum(p[x[0]][:x[1]]) for x in vect)) # вы­чис­ля­ем нуж­ную сумму

print(m)


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