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

Дана по­сле­до­ва­тель­ность целых чисел. Не­об­хо­ди­мо вы­брать из по­сле­до­ва­тель­но­сти три числа так, чтобы они об­ра­зо­ва­ли воз­рас­та­ю­щую по­сле­до­ва­тель­ность. Опре­де­ли­те ми­ни­маль­но воз­мож­ную сумму вы­бран­ных чисел.

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

Файл А

Файл В

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

При­мер.

Дан вход­ной файл:

4

3

5

2

6

Из этого файла надо вы­брать числа 3, 5 и 6, сумма ко­то­рых равна 14.

Вы­брать числа 3, 5 и 2 нель­зя, так как они не об­ра­зу­ют воз­рас­та­ю­щую по­сле­до­ва­тель­ность.

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

 

Ответ:

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

Ре­ше­ние.

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

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

n = int(f.readline())

a = []

for x in range(n):

a.append(int(f.readline()))

min_summa=10**10

for i in range (len(a)):

for j in range(i+1,len(a)):

for k in range(j+1,len(a)):

if a[i] < a[j] < a[k]:

min_summa=min(min_summa, a[i]+a[j]+a[k])

print(min_summa)

 

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

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

n = int(f.readline())

a = []

for x in range(n):

a.append([int(f.readline()),x]) # До­бав­ля­ем в мас­сив число и его ин­декс

a.sort()

a = a[:10] # Так как мас­сив от­сор­ти­ро­ван по воз­рас­та­нию, берем пер­вые 10 зна­че­ний и ищем среди них 3 числа удо­вле­тво­ря­ю­щие усло­вию. Если среди 10 чисел не будет най­ден ответ, диа­па­зон можно уве­ли­чить

a.sort(key=lambda x: x[1]) #сор­ти­ру­ем мас­сив по ин­дек­сам

 

min_summa = 10**10

for i in range (len(a)):

for j in range(i+1,len(a)):

for k in range(j+1,len(a)):

if a[i][0] < a[j][0] < a[k][0]:

min_summa = min(min_summa, a[i][0] + a[j][0] + a[k][0])

print(min_summa)

 

Ответ: 30419&398.

 

 

При­ве­дем ре­ше­ние Ви­та­лия Бу­ди­ло­ва на языке Python.

with open('27-A.txt') as f:

n = int(f.readline())

data = [int(i) for i in f]

min_l = 10 ** 10 # ми­ни­маль­ное число слева

min_m = 10 ** 10 # ми­ни­маль­ное число по­се­ре­ди­не

mid_sum = 10 ** 10 # ми­ни­маль­ная сумма пер­вых двух чисел

res = 10 ** 10 # ис­ко­мая сумма трёх чисел

for i in range(2, len(data)):

min_l = min(min_l, data[i - 2]) # нашли ми­ни­мум слева

if data[i - 1] > min_l: # про­ве­ря­ем, что сле­ду­ю­щее число с преды­ду­щим даёт воз­рас­та­ю­щую посл.

if min_l + data[i - 1] <= mid_sum: # если новая сумма «лучше» преж­ней

mid_sum = min_l + data[i - 1] # об­нов­ля­ем мин сумму пары

min_m = data[i - 1] # и об­нов­ля­ем зна­че­ние ми­ни­маль­но­го по­се­ре­ди­не

if data[i] > min_m: # про­ве­ря­ем, что сле­ду­ю­щее число тоже вхо­дит в воз­рас­та­ю­щую по­сле­до­ва­тель­ность

res = min(res, mid_sum + data[i])

print(res)

 

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

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

left = [a[0]] # ми­ни­маль­ное число слева

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

right = [a[-1]] # ми­ни­маль­ное число спра­ва

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

right = right[::-1]

r = [left[i-1] + right[i+1] + a[i] for i in range(1,len(a) - 1) if left[i-1] < a[i] < right[i+1]]

print(min(r))


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