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

Дана по­сле­до­ва­тель­ность целых чисел. Рас­сто­я­ние между эле­мен­та­ми по­сле­до­ва­тель­но­сти  — это раз­ность их по­ряд­ко­вых но­ме­ров. На­при­мер, если два эле­мен­та стоят в по­сле­до­ва­тель­но­сти рядом, рас­сто­я­ние между ними равно 1, если два эле­мен­та стоят через один  — рас­сто­я­ние равно 2 и так далее.

Не­об­хо­ди­мо вы­брать из по­сле­до­ва­тель­но­сти три числа так, чтобы мак­си­маль­ное рас­сто­я­ние между вы­бран­ны­ми чис­ла­ми было не мень­ше 3K, а их сумма была мак­си­маль­но воз­мож­ной.

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

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

Файл А

Файл В

Пер­вая стро­ка вход­но­го файла со­дер­жит целое число K  — па­ра­метр для опре­де­ле­ния рас­сто­я­ния, вто­рая стро­ка со­дер­жит число N  — общее ко­ли­че­ство чисел в на­бо­ре (1 < 3K < N). Каж­дая из сле­ду­ю­щих N строк со­дер­жит одно число, не пре­вы­ша­ю­щее по мо­ду­лю 107.

При­мер вход­но­го файла:

1

5

6

7

8

2

3

Из этого файла в со­от­вет­ствии с усло­ви­я­ми можно вы­брать числа 7, 8 и 3. Мак­си­маль­ное рас­сто­я­ние в дан­ном слу­чае равно 3 (между чис­ла­ми 7 и 3). Числа 6, 7 и 8 взять нель­зя, так как мак­си­маль­ное рас­сто­я­ние в этом слу­чае равно 2, а по усло­вию оно долж­но быть не мень­ше 3. В от­ве­те для этого при­ме­ра надо на­пи­сать число 18.

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

 

Ответ:

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

Ре­ше­ние.

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

k, n, *a = map(int, open('27-A.txt'))

b = {x: a.count(x) for x in sorted(a)[::-1][:3]}

back = m = float('-inf')

for i in range(3*k, n):

back = max(back, a[i-3*k])

any_mx = max(x for x in b if (b[x] - (a[i] == x) - (back == x)) > 0)

m = max(m, back + any_mx + a[i])

print(m)

 

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

k, n, *a = map(int, open('27-B.txt'))

b = {x: a.count(x) for x in sorted(a)[::-1][:3]}

back = m = float('-inf')

for i in range(3*k, n):

back = max(back, a[i-3*k])

any_mx = max(x for x in b if (b[x] - (a[i] == x) - (back == x)) > 0)

m = max(m, back + any_mx + a[i])

print(m)

 

Ответ: 214796 21506.

 

При­ве­дем ре­ше­ние Борис М. на языке Python.

def calc_sum(arr, N, K):

# мак­си­маль­ная сумма трой­ки чисел

maxsum = min(arr)*3

# мак­си­маль­ное число свер­ху от вы­бор­ки - участ­ву­ет в рас­че­те суммы троек

back = arr[0]

# мак­си­маль­ное число в се­ре­ди­не вы­бор­ки - вто­рое число вы­бор­ки

m2 = max(arr[1:3*K])

# кур­сор - тре­тье число вы­бор­ки, на­чаль­ное по­ло­же­ние 3*К

for i in range(3*K, N):

# пер­вое число вы­бор­ки - назад на 3К от кур­со­ра

m1 = arr[i-3*K]

# пе­ре­счи­тать мак­си­маль­ное число свер­ху от вы­бор­ки

back = max(back, m1)

# если пер­вое число до­стиг­ло вто­ро­го

if m1 == m2:

# сди­нуть вто­рое число - мак­си­маль­ное число в се­ре­ди­не вы­бор­ки

m2 = max(arr[1+i-3*K:i])

# тре­тье число вы­бор­ки - кур­сор

m3 = arr[i]

# сумма трой­ки чисел - вме­сто пер­во­го бе­рет­ся макс. свер­ху

s = back + m2 + m3

# пе­ре­счи­тать мак­си­маль­ную сумму

maxsum = max(maxsum, s)

# если тре­тье число вы­бор­ки боль­ше вто­ро­го

if m3 > m2:

# об­но­вить вто­рое число вы­бор­ки

m2 = m3

return maxsum

files = ['27-A.txt', '27-B.txt']

for name in files:

K, N, *arr = map(int, open(name))

print(name, '->', calc_sum(arr, N, K))