Тема 27. Программирование
27.03 Цепочки, выбор последовательности, префиксные суммы
Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела программирование
Решаем задачи

Ошибка.
Попробуйте повторить позже

Задача 1#86281

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 101. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (2 ≤ N ≤ 108  ). Каждая из следующих N строк содержит натуральное число, не превышающее 10 000.

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

7

34

27

33

11

101

12

95

В этом наборе можно выбрать последовательность 101 (сумма 101) имеет длину 1. Ответ: 1.

В ответе укажите два числа через пробел: сначала значение искомой длины для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
Решение для А пункта:
f = open(’5_27A.txt’)
n = int(f.readline())
a = [int(i) for i in f]
mx = 0
l = 0
for i in range(len(a)):
    s = 0
    k = 0
    for j in range(i,len(a)):
        s += a[j]
        k += 1
        if s % 101 == 0:
            if s > mx or (s == mx and k < l):
                mx = s
                l = k
print(l)
Решение для Б пункта:
f = open(’5_27B.txt’)
n = int(f.readline())
D = 101
mx = 0
l = 0
s = 0
k = [10**20 for i in range(D)]
ml = [0 for i in range(D)]
for i in range(n):
    x = int(f.readline())
    s += x
    if s % D == 0:
        mx = s
        l = i + 1
    s1 = s - k[s % D]
    l1 = (i+1) - ml[s % D]
    if s1 > mx or (s1 == mx and l1 < l):
        l = l1
        mx = s1
    if s < k[s % D]:
        k[s % D] = s
        ml[s % D] = i + 1
print(l)

Ответ: 985 999990

Ошибка.
Попробуйте повторить позже

Задача 2#86280

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 97 и при этом количество чисел кратных 13 равно 17. Найдите среди них подпоследовательность с максимальной суммой. В ответ укажите значение суммы.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (2 ≤ N ≤ 108  ). Каждая из следующих N строк содержит натуральное число, не превышающее 10 000.

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
Решение для А пункта:
f = open(’5_27A.txt’)
n = int(f.readline())
a = [int(i) for i in f]
mx = 0
for i in range(len(a)):
    s = 0
    k = 0
    for j in range(i,len(a)):
        s += a[j]
        if a[j] % 13 == 0:
            k += 1
        if s % 97 == 0 and k == 17:
            mx = max(mx,s)
print(mx)
Решение для Б пункта:
f = open(’5_27B.txt’)
n = int(f.readline())
D = 97
M = 13
d = {(x,y):10**20 for x in range(D) for y in range(-17,76828+1)}
#Предварительно, нужно посчитать количество чисел в файле,
#кратных 13. Перебор начинается от -17 во избежании ошибки,
#поскольку на первых итерациях значение выражения k - 17 будет отрицательным.
mx = 0
s = 0
k = 0
for i in range(n):
    x = int(f.readline())
    s += x
    if x % M == 0:
        k += 1
    if s % D == 0 and k == 17:
        mx = max(mx,s)
    s1 = s - d[(s % D,k-17)]#получаем сумму, которая делится нацело на 97
    # и содержит ровно 17 чисел кратных 13
    mx = max(mx,s1)
    d[(s%D,k)] = min(d[(s%D,k)],s)#обновление значений в словаре
print(mx)

Ответ: 125033 2500854

Ошибка.
Попробуйте повторить позже

Задача 3#86279

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 169 и при этом количество простых чисел кратно 10. Найдите среди них подпоследовательность с максимальной суммой. В ответ укажите значение суммы.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (2 ≤ N ≤ 108  ). Каждая из следующих N строк содержит натуральное число, не превышающее 10 000.

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
Решение для А пункта:
def simple(x):
    return x > 1 and all(x % y for y in range(2,int(x**0.5)+1))

f = open(’5_27A.txt’)
n = int(f.readline())
a = [int(i) for i in f]
D = 169
M = 10
mx = 0
for i in range(len(a)):
    s = 0
    k = 0
    for j in range(i,len(a)):
        s += a[j]
        if simple(a[j]):
            k += 1
        if s % D == 0 and k % M == 0:
            mx = max(mx,s)
print(mx)
Решение для Б пункта:
def simple(x):
    return x > 1 and all(x % y for y in range(2,int(x**0.5)+1))

f = open(’5_27B.txt’)
n = int(f.readline())
D = 169
M = 10
d = {(x,y): 10**20 for x in range(D) for y in range(M)}#словарь, в котором
#в качестве ключа у нас будет пара чисел:
#первое значение, это остаток при делении на 169, второе - остаток при делении на 10.
#В качестве значения у нас будет префиксная сумма. То есть, теперь в случае чего знаем,
#при каком остатке при делении на D и при каком остатке при делении на M была какая префиксная сумма.
mx = 0
s = 0
k = 0
for i in range(n):
    x = int(f.readline())
    s += x
    if simple(x):k += 1
    if s % D == 0 and k % M == 0:
        mx = max(mx,s)
    s1 = s - d[(s % D,k % M)]
                                                                                                  
                                                                                                  
    mx = max(mx,s1)
    d[(s % D, k % M)] = min(d[(s % D, k % M)],s)
print(mx)

Ответ: 468130 5006122732

Ошибка.
Попробуйте повторить позже

Задача 4#86278

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 13 и при этом количество чисел кратных 5 кратно 7. Найдите среди них подпоследовательность с максимальной суммой. В ответ укажите значение суммы.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (2 ≤ N ≤ 108  ). Каждая из следующих N строк содержит натуральное число, не превышающее 10 000.

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
Решение для А пункта:
f = open(’4_27A.txt’)
n = int(f.readline())
a = [int(i) for i in f]
mx = 0
for i in range(len(a)):
    s = 0
    k5 = 0
    for j in range(i,len(a)):
        s += a[j]
        if a[j] % 5 == 0:
            k5 += 1
        if s % 13 == 0 and k5 % 7 == 0:
            mx = max(mx,s)
print(mx)
Решение для Б пункта:
f = open(’4_27B.txt’)
n = int(f.readline())
d = {(x,y):10**20 for x in range(13) for y in range(7)}#словарь, в котором
#в качестве ключа у нас будет пара чисел:
#первое значение, это остаток при делении на 13, второе - остаток при делении на 7.
#В качестве значения у нас будет префиксная сумма. То есть, теперь в случае чего знаем,
#при каком остатке при делении на 13 и при каком остатке при делении на 7 была какая префиксная сумма.

s = 0
mx = 0
k5 = 0
for i in range(n):
    x = int(f.readline())
    s += x
    if x % 5 == 0:k5 += 1
    if s % 13 == 0 and k5 % 7 == 0:
        mx = max(mx,s)
    s1 = s - d[(s%13,k5%7)]
    mx = max(mx,s1)

    d[(s % 13,k5 % 7)] = min(s,d[(s % 13,k5 % 7)])
print(mx)

Ответ: 249821 496340442

Ошибка.
Попробуйте повторить позже

Задача 5#86277

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 113. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой длинной из них.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (2 ≤ N ≤ 108  ). Каждая из следующих N строк содержит натуральное число, не превышающее 10 000.

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

7

53

27

33

11

101

12

95

В этом наборе можно выбрать последовательности 53+27+33 (сумма 113) и 101+12 (сумма 113). Самая длинная из них, 34+27+33, имеет длину 3. Ответ: 3.

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
Решение для А пункта:
f = open(’4_27A.txt’)
n = int(f.readline())
a = [int(i) for i in f]
mx = 0
l = 0
for i in range(len(a)):
    s = 0
    k = 0
    for j in range(i,len(a)):
        s += a[j]
        k += 1
        if s % 113 == 0:
            if s > mx or (s == mx and k > l):
                mx = s
                l = k
print(l)
Решение для Б пункта:
f = open(’4_27B.txt’)
n = int(f.readline())
D = 113
mx = 0
l = 0
k = [10**20 for i in range(D)]
ml = [0 for i in range(D)]
s = 0
for i in range(n):
    x = int(f.readline())
    s += x
    if s % D == 0:
        mx = s
        l = i + 1
    s1 = s - k[s % D]
    l1 = (i+1) - ml[s % D]
    if s1 > mx or (s1 == mx and l1 > l):
        mx = s1
        l = l1
    if s < k[s % D]:
        k[s % D] = s
        ml[s % D] = i+1
print(l)

Ответ: 492 98988

Ошибка.
Попробуйте повторить позже

Задача 6#86276

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна максимальному числу из файла, которое находится в ряду Фибоначчи. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (          8
2 ≤ N ≤ 10  ). Каждая из следующих N строк содержит натуральное число, не превышающее 10 000.

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

7

44

11

42

5

34

63

95

В этом наборе можно выбрать последовательность 44+11+42+5+34 (сумма 136), кратна 34 ( это число является максимальным из файла, которое при этом находится в ряду Фибоначчи). Длина этой подпоследовательности равна 5. Ответ: 5.

В ответе укажите два числа через пробел: сначала значение искомой длины для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
Решение для А пункта:
f = open(’3_27A.txt’)
n = int(f.readline())
a = [int(i) for i in f]
max_a = max(a)

fibb = [0,1,1]
while fibb[-1] < max_a:
    fibb.append(fibb[-1] + fibb[-2])
D = max(x for x in set(a) if x in fibb)
mx = 0
l = 0
for i in range(len(a)):
    s = 0
    k = 0
    for j in range(i,len(a)):
        s += a[j]
        k += 1
        if s % D == 0:
            if s > mx or (s == mx and k < l):
                mx = s
                l = k
print(l)
Решение для Б пункта:
f = open(’3_27B.txt’)
n = int(f.readline())
a = [int(i) for i in f]
fibb = [0,1]
while fibb[-1] < max(a):
    fibb.append(fibb[-1] + fibb[-2])
D = max(x for x in set(a) if x in fibb)
mx = 0
l = 0
k = [10**20 for i in range(D)]
ml = [0 for i in range(D)]
s = 0
for i in range(n):
    x = a[i]
    s += x
    if s % D == 0:
        mx = s
        l = i + 1
    s1 = s - k[s % D]
                                                                                                  
                                                                                                  
    l1 = (i+1) - ml[s % D]
    if s1 > mx or (s1 == mx and l1 < l):
        mx = s1
        l = l1
    if s < k[s % D]:
        k[s % D] = s
        ml[s % D] = i + 1
print(l)

Ответ: 343 47816

Ошибка.
Попробуйте повторить позже

Задача 7#86275

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна максимальному простому числу из файла. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (2 ≤ N ≤ 108  ). Каждая из следующих N строк содержит натуральное число, не превышающее 10 000.

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

7

44

11

42

11

34

63

95

В этом наборе можно выбрать последовательность 44+11 (сумма 55), которая имеет длину 2. Ответ: 2.

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
Решение для А пункта:
def simple(x):#функция для проверки числа на простоту
    return x > 1 and all(x % y for y in range(2,int(x**0.5)+1))
f = open(’3_27A.txt’)
n = int(f.readline())
a = [int(i) for i in f]
max_simple = max(x for x in a if simple(x))
mx = 0
l = 0
for i in range(len(a)):
    s = 0
    k = 0
    for j in range(i,len(a)):
        s += a[j]
        k += 1
        if s % max_simple == 0:
            if s > mx or (s == mx and k < l):
                mx = s
                l = k
print(l)
Решение для Б пункта:
def simple(x):
    return x > 1 and all(x % y for y in range(2,int(x**0.5)+1))
f = open(’3_27B.txt’)
a = [int(i) for i in f]
max_simple = max(x for x in a if simple(x))
k = [10**20 for i in range(max_simple)]
ml = [0 for i in range(max_simple)]
mx = 0
l = 0
s = 0
for i in range(n):
    x = a[i]
    s += x
    if s % max_simple == 0:
        mx = s
        l = i + 1
    s1 = s - k[s % max_simple]
    l1 = (i+1) - ml[s % max_simple]
    if s1 > mx or (s1 == mx and l1 < l):
        mx = s1
        l = l1
    if s < k[s % max_simple]:
                                                                                                  
                                                                                                  
        k[s % max_simple] = s
        ml[s % max_simple] = i + 1
print(l)

Ответ: 286 47939

Ошибка.
Попробуйте повторить позже

Задача 8#86274

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие, что сумма элементов каждой из них кратна k = 375. Найдите среди них подпоследовательность с максимальной нечётной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 107)  . Каждая из следующих N строк содержит натуральное число, не превышающее   4
10  .

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

7

58

495

217

674

609

193

375

В этом наборе можно выбрать число 375. Ответом для данного примера будет число 1.

В ответе укажите два числа через пробел: сначала значение искомой длины для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
Решение для А пункта:
f = open(’2_27A.txt’)
n = int(f.readline())
a = [int(i) for i in f]
mx = 0
l = 0
for i in range(len(a)):
    s = 0
    k = 0
    for j in range(i, len(a)):
        s += a[j]
        k += 1
        if s % 375 == 0 and s % 2 != 0:
            if s > mx or (s == mx and k < l):
                mx = s
                l = k
print(l)
Решение для Б пункта:
f = open(’2_27B.txt’)
n = int(f.readline())
mx = 0
l = 0
D = 375
k = [[10 ** 20 for i in range(2)] for j in range(D)]
ml = [[0 for i in range(2)] for j in range(D)]
s = 0
for i in range(n):
    x = int(f.readline())
    s += x
    if s % D == 0 and s % 2 != 0:
        mx = s
        l = i + 1
    s1 = s - k[s % D][1 - s % 2]
    l1 = (i + 1) - ml[s % D][1 - s % 2]
    if s1 > mx or (s1 == mx and l1 < l):
        mx = s1
        l = l1
    if s < k[s%D][s%2]:
        k[s%D][s%2] = s
        ml[s%D][s%2] = i+1
print(l)

Ответ: 967 999952

Ошибка.
Попробуйте повторить позже

Задача 9#86273

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие, что сумма элементов каждой из них кратна k = 317. Найдите среди них подпоследовательность с максимальной чётной суммой. В ответ укажите значение суммы

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 107)  . Каждая из следующих N строк содержит натуральное число, не превышающее 104  .

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

7

58

495

81

674

609

193

375

В этом наборе можно выбрать числа 58, 495 и 81, которые в сумме образуют число 634, четное число, кратное 317. Ответом для данного примера будет число 634.

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
Решение для А пункта:
f = open(’2_27A.txt’)
n = int(f.readline())
a = [int(i) for i in f]
mx = 0
for i in range(len(a)):
    s = 0
    for j in range(i,len(a)):
        s += a[j]
        if s % 317 == 0 and s % 2 == 0:
            mx = max(mx,s)
print(mx)
Решение для Б пункта:
f = open(’2_27B.txt’)
n = int(f.readline())
D = 317
k = [[10**20 for i in range(2)] for j in range(D)]#двумерный массив,
#в котором мы будем хранить минимальные префиксные суммы
#любой чётности любого возможного остатка при делении на D
mx = 0
s = 0
for i in range(n):
    x = int(f.readline())
    s += x
    if s % D == 0 and s % 2 == 0:
        mx = max(mx,s)
    s1 = s - k[s%D][s%2]#новая сумма с отрубленным хвостиком, которая является чётной и кратной 317
    mx = max(mx,s1)
    k[s%D][s%2] = min(k[s%D][s%2],s)#обновляем список k, храним минимальные префиксные суммы
print(mx)

Ответ: 4708718 5002805874

Ошибка.
Попробуйте повторить позже

Задача 10#86272

Дана последовательность из N целых чисел. Рассматриваются все её непрерывные подпоследовательности, такие, что сумма элементов каждой из них равна 0. Найдите среди них подпоследовательность с максимальной длиной. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой длинной из них.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 107)  . Каждая из следующих N строк содержит целое число, по модулю не превышающее   4
10  .

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

7

32

10

-18

-22

-22

20

-43

В этом наборе можно выбрать числа 32, 10,-18,-22,-22,20 которые в сумме образуют число 0. Её длина будет равна 6.

В ответе укажите два числа через пробел: сначала значение искомой длины для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
Решение для А пункта:
f = open(’27A_04_2__3knes.txt’)
n = int(f.readline())
a = [int(i) for i in f]
l = 0
for i in range(len(a)):
    s = 0
    k = 0
    for j in range(i,len(a)):
        s += a[j]
        k += 1
        if s == 0:
            l = max(l,k)
print(l)
Решение для Б пункта:
’’’
Префиксная сумма равна 0, только в том случае, если конец и начало префиксной суммы равны между собой.
Идея решения: мы создадим словарь, у которого в качестве ключа будет значение префиксной суммы,
а в качестве значения у нас будет список, который будет хранить номера индексов,
на которых встречалась такая сумма.
Затем мы сможем найти максимальную длину вычитав минимальный индекс из максимального индекса,
на котором встречалась данная сумма.
’’’
f = open(’27B_04_2__3knet.txt’)
n = int(f.readline())
l = 0
d = dict()#создаем словарь, в котором будем хранить значения префиксной суммы и номера индексов
s = 0
for i in range(n):
    x = int(f.readline())
    s += x
    if s not in d.keys():#если данная префиксная сумма ранее не встречалась,
#то добавляем первый индекс к данной сумме
        d[s] = [i]
    else:#в ином случае добавляем новый индекс в список
        d[s].append(i)
res = [x for x in d.values() if len(x) > 1] #получаем списки индексов,
#чьи префиксные сумма встречались более одного раза за файл.
l = max(max(x) - min(x) for x in res) #определяем максимальную длину подпоследовательности.
print(l)

Ответ: 90 425361

Ошибка.
Попробуйте повторить позже

Задача 11#82950

Дана последовательность натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, в которых количество простых чисел кратно 10. Найдите наибольшую сумму такой подпоследовательности.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N            7
(1 ≤ N ≤ 10)  . Каждая из следующих N строк содержит натуральное число, не превышающее 103  .

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
def simple(x):
    if x < 2:
        return False
    for i in range(2, int(x ** 0.5) + 1):
        if x % i == 0:
            return False
    return True


f = open(’27B_09_5.txt’)
n = int(f.readline())
a = [int(i) for i in f]

# Чему кратно количество чисел
d = 10

r = 0  # Количество встреченных простых чисел
# Для сумм с нулевым количеством нужных чисел изначально самая маленькая - начальная
tails = [0] + [10 ** 10] * (d - 1)
mx = 0
s = 0

for i in range(n):
    x = a[i]
    # Увеличиваем общую сумму
    s += x

    # Если нашли нужное число - увеличиваем на 1 их количество
    # перезаписываем хвост, выбирая наименьший для этого
    # количества оканчивающихся k чисел
    if simple(x):
        r += 1
        if s < tails[r % d]:
            tails[r % d] = s

    # Находим максимальную сумму, отсекая хвост с количеством оканчивающихся k чисел
    # равным остатку от деления на необходимое количество d
    if s - tails[r % d] > mx:
        mx = s - tails[r % d]

print(mx)


                                                                                                  
                                                                                                  

Ответ: 464173 500516847

Ошибка.
Попробуйте повторить позже

Задача 12#82947

На вход программы подаётся натуральное число N, а затем N целых чисел. Необходимо определить минимальную сумму смежных элементов последовательности

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N           7
(1 ≤ N ≤ 10)  . Каждая из следующих N строк содержит целое число, по модулю не превышающее 104  .

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
f = open(’27B_09_4.txt’)
n = int(f.readline())
a = [int(i) for i in f]

# Общая сумма
s = 0
# Максимальный префикс
mx = 0
mn = 0

for i in range(n):
    x = a[i]
    # Увеличиваем общую сумму
    s += x
    # Если вычесть из суммы максимальный префикс - будет ли она меньше минимума
    # если да - перезаписать минимум
    if s - mx < mn:
        mn = s - mx

    # При необходимости заменить префикс
    mx = max(mx, s)

print(mn)

Ответ: -138654 -6932214

Ошибка.
Попробуйте повторить позже

Задача 13#82946

На вход программы подаётся натуральное число N, а затем N целых чисел. Необходимо определить максимальную сумму смежных элементов последовательности

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N           7
(1 ≤ N ≤ 10)  . Каждая из следующих N строк содержит целое число, по модулю не превышающее 104  .

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
f = open(’27B_09_3.txt’)
n = int(f.readline())
a = [int(i) for i in f]

# Общая сумма
s = 0
mx = 0
# Минимальный префикс
mn = 0

for i in range(n):
    x = a[i]
    # Увеличиваем общую сумму
    s += x
    # Если вычесть из суммы минимальный префикс - будет ли она больше максимума
    # если да - перезаписать максимум
    if s - mn > mx:
        mx = s - mn

    # При необходимости заменить префикс
    mn = min(mn, s)

print(mx)

Ответ: 133776 11715538

Ошибка.
Попробуйте повторить позже

Задача 14#82945

Дана последовательность целых чисел. Рассматриваются все её непрерывные подпоследовательности, в которых количество чисел, оканчивающихся на 31 кратно 12. Найдите наибольшую сумму наибольшей такой подпоследовательности.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 107)  . Каждая из следующих N строк содержит целое число, по модулю не превышающее 104  .

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
f = open(’27B_09_2.txt’)
n = int(f.readline())
a = [int(i) for i in f]

# На что оканчиваются числа
k = 31
# Чему кратно количество чисел
d = 12


r = 0  # Количество встреченных чисел оканчивающихся k
# Для сумм с нулевым количеством нужных чисел изначально самая маленькая - начальная
tails = [0] + [10 ** 10] * (d - 1)
mx = 0
s = 0

for i in range(n):
    x = a[i]
    # Увеличиваем общую сумму
    s += x

    # Если нашли нужное число - увеличиваем на 1 их количество
    # перезаписываем хвост, выбирая наименьший для этого
    # количества оканчивающихся k чисел
    if (abs(x) % 100) == k:
        r += 1
    if s < tails[r % d]:
        tails[r % d] = s

    # Находим максимальную сумму, отсекая хвост с количеством оканчивающихся k чисел
    # равным остатку от деления на необходимое количество d
    if s - tails[r % d] > mx:
        mx = s - tails[r % d]

print(mx)

Ответ: 121892 14990022

Ошибка.
Попробуйте повторить позже

Задача 15#82944

Дана последовательность целых чисел. Рассматриваются все её непрерывные подпоследовательности, в которых количество чисел, делящихся на 18 кратно 7. Найдите наибольшую сумму наибольшей такой подпоследовательности.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 107)  . Каждая из следующих N строк содержит целое число, по модулю не превышающее 104  .

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
f = open(’27B_09_1.txt’)
n = int(f.readline())
a = [int(i) for i in f]

# Чему кратны числа
k = 18
# Чему кратно количество чисел
d = 7

r = 0  # Количество встреченных чисел кратных k
# Для сумм с нулевым количеством нужных чисел изначально самая маленькая - начальная
tails = [0] + [10 ** 10] * (d - 1)
mx = 0
s = 0

for i in range(n):
    x = a[i]
    # Увеличиваем общую сумму
    s += x

    # Если нашли нужное число - увеличиваем на 1 их количество
    # перезаписываем хвост, выбирая наименьший для этого
    # количества кратных k чисел
    if x % k == 0:
        r += 1
    if s < tails[r % d]:
        tails[r % d] = s

    # Находим максимальную сумму, отсекая хвост с количеством кратных k чисел
    # равным остатку от деления на необходимое количество d
    if s - tails[r % d] > mx:
        mx = s - tails[r % d]

print(mx)

Ответ: 65587 8509602

Ошибка.
Попробуйте повторить позже

Задача 16#82943

Дана последовательность из N целых чисел. Рассматриваются все её непрерывные подпоследовательности, такие, что сумма элементов каждой из них кратна k = 27. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 107)  . Каждая из следующих N строк содержит целое число, по модулю не превышающее   4
10  .

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

7

35

10

-18

-22

-22

49

-43

В этом наборе можно выбрать числа 35, 10 и -18, которые в сумме образуют число 27. А также числа -22 и 49, тоже в сумме образующие число 27. Ответом для данного примера будет число 2.

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
f = open(’27B_04_2.txt’)
n = int(f.readline())
a = [int(i) for i in f]

k = 27

# Из сумм, изначально кратных 27-и не нужно ничего вычитать, поэтому для остатка 0 сумма всегда 0
sm = [0] + [10 ** 10] * (k - 1)
# Префиксная сумма от начала строки до i имеет длину (i + 1), поэтому изначально хвосты равны -1
tl = [-1] * k
s = 0
mx = 0
ln = 0

for i in range(len(a)):
    # Увеличиваем основную сумму
    s += a[i]

    # ВАЖНО - из-за наличия отрицательных чисел нельзя считать s
    # самой большой суммой на данный момент

    # Вычитаем из основной суммы префиксную с нужным остатком - получаем кратную 27-и сумму
    if s - sm[s % k] > mx:
        mx = s - sm[s % k]
        ln = i - tl[s % k]
    elif s - sm[s % k] == mx:  # Если суммы равны - выбираем самую короткую
        ln = min(ln, i - tl[s % k])

    # Заменяем префиксную сумму для остатка, если нашли её меньше чем  предыдущую
    if s < sm[s % k]:
        sm[s % k] = s
        tl[s % k] = i

print(ln)

Ответ: 734 86922

Ошибка.
Попробуйте повторить позже

Задача 17#82942

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие, что сумма элементов каждой из них кратна k = 375. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой длинной из них.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 107)  . Каждая из следующих N строк содержит натуральное число, не превышающее   4
10  .

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

7

58

495

217

674

609

193

375

В этом наборе можно выбрать числа 217, 674 и 609, которые в сумме образуют число 1500, кратное 375. А также последнее число 375. Ответом для данного примера будет число 3.

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
f = open(’27B_04_1.txt’)
n = int(f.readline())
a = [int(i) for i in f]

k = 375

# Из сумм, изначально кратных 375-и не нужно ничего вычитать, поэтому для остатка 0 сумма всегда 0
sm = [0] + [10 ** 10] * (k - 1)
# Префиксная сумма от начала строки до i имеет длину (i + 1), поэтому изначально хвосты равны -1
tl = [-1] * k
s = 0
mx = 0
ln = 0

for i in range(len(a)):
    # Увеличиваем основную сумму
    s += a[i]
    # Вычитаем из основной суммы префиксную с нужным остатком - получаем кратную 375-и сумму
    if s - sm[s % k] > mx:
        mx = s - sm[s % k]
        ln = i - tl[s % k]
    elif s - sm[s % k] == mx:  # Если суммы равны - выбираем самую длинную
        ln = max(ln, i - tl[s % k])

    # Заменяем префиксную сумму для остатка, если нашли её меньше чем  предыдущую
    if s < sm[s % k]:
        sm[s % k] = s
        tl[s % k] = i

print(ln)

Ответ: 967 999952

Ошибка.
Попробуйте повторить позже

Задача 18#81715

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 97. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (2 ≤ N ≤ 108  ). Каждая из следующих N строк содержит натуральное число, не превышающее 10 000.

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

7

44

11

42

11

34

63

95

В этом наборе можно выбрать последовательности 44+11+42 (сумма 97) и 34+63 (сумма 97). Самая короткая из них, 34+63, имеет длину 2. Ответ: 2.

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
f = open(’1.txt’)
n = int(f.readline())
s = 0
res = []
maxs = [0] + [False]*96
lens = [0] + [False]*96
for i in range(1, n+1):
    s += int(f.readline())
    ost = s%97
    if maxs[ost] != False and ost != 0:
        res.append([s-maxs[ost], lens[ost]-i])
    elif ost == 0:
        res.append([s-maxs[ost], lens[ost]-i])
    else:
        maxs[ost] = s
        lens[ost] = i
print(abs(max(res)[1]))

Ответ: 348 47985

Ошибка.
Попробуйте повторить позже

Задача 19#81714

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 138. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (2 ≤ N ≤ 108  ). Каждая из следующих N строк содержит натуральное число, не превышающее 10 000.

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

7

34

27

58

11

101

37

95

В этом наборе можно выбрать последовательности 34+27+58 (сумма 138) и 101+37 (сумма 138). Самая короткая из них, 101+37, имеет длину 2. Ответ: 2.

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
f = open(’1.txt’)
n = int(f.readline())
s = 0
res = []
maxs = [0] + [False]*137
lens = [0] + [False]*137
for i in range(1, n+1):
    s += int(f.readline())
    ost = s%138
    if maxs[ost] != False and ost != 0:
        res.append([s-maxs[ost], lens[ost]-i])
    elif ost == 0:
        res.append([s-maxs[ost], lens[ost]-i])
    else:
        maxs[ost] = s
        lens[ost] = i
print(abs(max(res)[1]))

Ответ: 494 98984

Ошибка.
Попробуйте повторить позже

Задача 20#81713

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 80. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (2 ≤ N ≤ 108  ). Каждая из следующих N строк содержит натуральное число, не превышающее 10 000.

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

7

34

27

19

11

29

51

95

В этом наборе можно выбрать последовательности 34+27+19 (сумма 80) и 29+51 (сумма 80). Самая короткая из них, 29+51, имеет длину 2. Ответ: 2.

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

Вложения к задаче
Показать ответ и решение
f = open(’1.txt’)
n = int(f.readline())
s = 0
res = []
maxs = [0] + [False]*79
lens = [0] + [False]*79
for i in range(1, n+1):
    s += int(f.readline())
    ost = s%80
    if maxs[ost] != False and ost != 0:
        res.append([s-maxs[ost], lens[ost]-i])
    elif ost == 0:
        res.append([s-maxs[ost], lens[ost]-i])
    else:
        maxs[ost] = s
        lens[ost] = i
print(abs(max(res)[1]))

Ответ: 188 69982
Рулетка
Вы можете получить скидку в рулетке!