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

Пусть S  — по­сле­до­ва­тель­ность из N чисел про­ну­ме­ро­ван­ных под­ряд на­чи­ная с 1. Обо­зна­чим Si, Sj, Sk три эле­мен­та по­сле­до­ва­тель­но­сти S, где i < j < k. Опре­де­ли­те в по­сле­до­ва­тель­но­сти S три таких числа Si, Sj, Sk, что Si > Sj, Sk > Sj и зна­че­ние вы­ра­же­ния (Si − Sj) + (Sk − Sj) мак­си­маль­но. В от­ве­те ука­жи­те най­ден­ное мак­си­маль­ное зна­че­ние вы­ра­же­ния (Si − Sj) + (Sk − Sj). Га­ран­ти­ру­ет­ся, что в по­сле­до­ва­тель­но­сти есть три числа Si, Sj, Sk, удо­вле­тво­ря­ю­щие усло­вию за­да­чи.

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

Файл A

Файл B

Дано два вход­ных файла (файл А и файл B), каж­дый из ко­то­рых в пер­вой стро­ке со­дер­жит число N (5 < N <10 000 000)  — ко­ли­че­ство целых чисел. Каж­дая из сле­ду­ю­щих N строк со­дер­жит одно целое число, зна­че­ние ко­то­ро­го по мо­ду­лю не пре­вы­ша­ет 1000. В от­ве­те ука­жи­те два числа: сна­ча­ла зна­че­ние ис­ко­мой ве­ли­чи­ны для файла А, затем  — для файла B.

 

Ответ:

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

Ре­ше­ние.

При­ведём ре­ше­ние на языке Python.

f = open('2772.txt')

n = int(f.readline())

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

sp_i = [-10**10]*n

curMx = -10**10

for i in range(n):

curMx = max(curMx, a[i])

sp_i[i] = curMx

sp_k = [-10**10]*n

curMx = -10 ** 10

for k in range(n-1, -1, -1):

curMx = max(curMx, a[k])

sp_k[k] = curMx

res = 0

for j in range(1, n-1):

if a[j] < sp_i[j-1] and a[j] < sp_k[j+1]:

res = max(res, (sp_i[j-1] - a[j]) + (sp_k[j+1] - a[j]))

print(res)

 

 

Ответ: 4000  3996.

 

 

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

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

left = [a[0]]

for x in a[1:]: left.append(max(left[-1],x))

right = [a[-1]]

for x in a[-2::-1]: right.append(max(right[-1],x))

right = right[::-1]

r = [left[i-1] + right[i+1] - 2*a[i] for i in range(1,len(a) - 1) if left[i-1] > a[i] and right[i+1] > a[i]]

print(max(r))

Источники: