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

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

Задача 1#61579

Задание выполняется с использованием прилагаемых файлов.

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

Входные данные:

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

Пример входных данных:

6 2

10

1

15

30

1515

3

Для указанных входных данных ответом будет 1530  .

В ответе укажите одно число: значение искомой величины для файла А. Файл Б для тех кто хочет проверить свои знания, ответ: 174980.

Вложения к задаче
Показать ответ и решение
def neeff(a, k): # Неэффективный алгоритм
    m = -10**9
    n = len(a)
    for i in range(n):
        for j in range(i + k, n):
            m = max(m, a[i] + a[j])
    return m


def eff(a, k): # Эффективный
    m = -10**9
    n = len(a)
    maxim = -10**20
    for i in range(k - 1, n):
        m = max(m, a[i] + maxim)
        # a[i - (k - 1)] --> свалку
        maxim = max(maxim, a[i - (k - 1)])
    return m

def eff_stat(a, k): # Эффективный статический
    b = []
    m = -10**9
    n = len(a)
    for i in range(n):
        b.append((a[i], i))
    b.sort()
    if len(b) >= 100:
        c = b[-100:]
    else:
        c = b.copy()
    for x in range(len(c)):
        for y in range(x + 1, len(c)):
            if abs(c[x][1] - c[y][1]) >= k:
                m = max(m, c[x][0] + c[y][0])
    return m

f = open(’Задача_27.txt’)
n, k = [int(s) for s in f.readline().split()]
a = [int(s) for s in f]
                                                                                                     
                                                                                                     
print(eff(a, k))

Ответ: 179

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

Задача 2#56890

Дано число N  затем N  натуральных чисел. Найти количество троек чисел, где элементы будут представлять собой строго возрастающую геометрическую прогрессию. Знаменатель геометрической прогрессии – натуральное число большее 1  .

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

В первой строке подается натуральное число 1 < N < 100000  . В каждой строке после записано одно натуральное число, не превышающее 10000  .

В ответе укажите одно число: значение для файла А.

Файл Б для тех, кто уверен в своих силах. Ответ для него: 75392942

Вложения к задаче
Показать ответ и решение
n = int(input())

mask = [0] * 10001

for i in range(n):
    mask[int(input())] += 1

ans = 0
for i in range(2, 101):
    for j in range(1, 10000 + 1):
        if j * i * i > 10000:
            break

        if mask[j] * mask[j * i] * mask[j * i * i] > 0:
            ans += mask[j] * mask[j * i] * mask[j * i * i]

print(ans)

Ответ: 1

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

Задача 3#56889

Дано число N  затем N  натуральных чисел. Найдите количество пар чисел, где произведение чисел будет кратно    8  , но некратно 16  , а сумма будет иметь остаток 4  при делении на 10  .

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

В первой строке подается натуральное число 1 < N < 100000  . В каждой строке после записано одно натуральное число, не превышающее 10000  .

Вложения к задаче
Показать ответ и решение
n = int(input())

sv = [[0]*10 for i in range(8+1)]
ans = 0

for i in range(n):
    x = int(input())

    if x % 16 != 0:
        for j in [8, 4, 2, 1]:
            if j * x % 8 == 0 and j * x % 16 != 0:
                for k in range(10):
                    if (k + x) % 10 == 4:
                        ans += sv[j][k]

        for j in [8, 4, 2, 1]:
            if x % j == 0:
                sv[j][x % 10] += 1
                break

print(ans)

Ответ: 1 15769843

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

Задача 4#56888

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

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

В первой строке подается натуральное число 1 < N < 100000  . В каждой строке после записано одно натуральное число, не превышающее 10000  .

Вложения к задаче
Показать ответ и решение
n = int(input())

# Количество полных квадратов
# mask[i] -- количество чисел i
mask = [0]*10001
count = 0 # Общее количество квадратов на данной итерации
ans = 0

for i in range(n):
    x = int(input())
    if x ** 0.5 == int(x ** 0.5):
        # Пары, где оба числа квадраты
        # и пары, где x - квадрат, а другое нет
        ans += count - mask[x] + (i - count)

        mask[x] += 1
        count += 1
    else:
        ans += count

print(ans)

Ответ: 54 78484522

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

Задача 5#56887

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

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

В первой строке подается натуральное число 1 < N < 100000  . В каждой строке после записано одно натуральное число, не превышающее 10000  .

Вложения к задаче
Показать ответ и решение
n = int(input())

# Количество полных квадратов
# mask[i] -- количество чисел i
mask = [0]*10001
count = 0 # Общее количество квадратов на данной итерации

ans = 0

for i in range(n):
    x = int(input())
    if x**0.5 == int(x**0.5):
        ans += count - mask[x]

        mask[x] += 1
        count += 1

print(ans)

Ответ: 3 1231738

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

Задача 6#55508

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

Среди всех таких пар найдите пару с максимальной суммой элементов и выведите элементы пары в порядке возрастания их числовых значений.

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

В первой строке подается натуральное число 1 < N < 100000  . В каждой строке после записано одно натуральное число, не превышающее 10000  .

Вложения к задаче
Показать ответ и решение
# первый элемент массивов -- чет
# второй -- нечет
kr17 = [0, 0]
nekr = [0, 0]

n = int(input())
ans = [0]

for i in range(n):
    x = int(input())
    if x % 17 == 0:
        if x + kr17[x % 2] > sum(ans):
            ans = [x, kr17[x % 2]]
        if x + nekr[x % 2] > sum(ans):
            ans = [x, nekr[x % 2]]

        kr17[x % 2] = max(kr17[x % 2], x)
    else:
        if x + kr17[x % 2] > sum(ans):
            ans = [x, kr17[x % 2]]
        nekr[x % 2] = max(nekr[x % 2], x)

print(ans)

Ответ: 3077 8759 9996 10000

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

Задача 7#45082

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

В первой строке входных данных задаётся количество чисел N  (1 ≤ N ≤ 100000)  . В каждой из последующих   N  строк записано одно целое положительное число, не превышающее 10000  .

Пример входных данных:

5

90

2

10

40

3

Выходные данные для приведённого выше примера: 5

В ответе укажите два числа: сначала значение искомого количества для файла A  , затем для файла B  .

Вложения к задаче
Показать ответ и решение
f = open(’27B.txt’)
n = int(f.readline())
ans = 0
kr = [[0]*10 for i in range(9)]

for i in range(n):
    x = int(f.readline())
    for j in [8, 4, 2, 1]:
        if x * j % 8 != 0:
            for k in range(10):
                if (x + k) % 10 != 0:
                    ans += kr[j][k]

    for j in [8, 4, 2, 1]:
        if x % j == 0:
            kr[j][x % 10] += 1
            break

print(ans)

Ответ: 146 2596382100

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

Задача 8#45081

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

В первой строке входных данных задаётся количество чисел N  (1 ≤ N ≤ 100000)  . В каждой из последующих   N  строк записано одно целое положительное число, не превышающее 10000  .

Пример входных данных:

5

90

2

10

40

3

Выходные данные для приведённого выше примера: 8

В ответе укажите два числа: сначала значение искомого количества для файла A  , затем для файла B  .

Вложения к задаче
Показать ответ и решение
f = open(’27B.txt’)
n = int(f.readline())
ans = 0
kr = [0]*50

for i in range(n):
    x = int(f.readline())
    for j in range(50):
        if (x + j) % 50 != 0:
            ans += kr[j]
    kr[x % 50] += 1

print(ans)

Ответ: 187 3974131350

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

Задача 9#45080

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

В первой строке входных данных задаётся количество чисел N  (1 ≤ N ≤ 100000)  . В каждой из последующих   N  строк записано одно целое положительное число, не превышающее 10000  .

Пример входных данных:

5

8

2

10

20

3

Выходные данные для приведённого выше примера: 8

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

Вложения к задаче
Показать ответ и решение
f = open(’27B.txt’)
n = int(f.readline())
ans = 0
kr = [0]*10

for i in range(n):
    x = int(f.readline())
    for j in range(10):
        if (x + j) % 10 != 0:
            ans += kr[j]
    kr[x % 10] += 1

print(ans)

Ответ: 174 3649957950

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

Задача 10#45079

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

В первой строке входных данных задаётся количество чисел N  (1 ≤ N ≤ 100000)  . В каждой из последующих   N  строк записано одно целое положительное число, не превышающее 10000  .

Пример входных данных:

5

12

12

12

30

13

Выходные данные для приведённого выше примера: 6

В ответе укажите два числа: сначала значение искомого количества для файла A  , затем для файла B  .

Вложения к задаче
Показать ответ и решение
f = open(’27B.txt’)
n = int(f.readline())
ans = 0
kr = [0]*31

for i in range(n):
    x = int(f.readline())
    for j in [30, 15, 10, 6, 5, 3, 2, 1]:
        if x * j % 30 != 0:
            ans += kr[j]

    for j in [30, 15, 10, 6, 5, 3, 2, 1]:
        if x % j == 0:
            kr[j] += 1
            break

print(ans)

Ответ: 149 3535831350

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

Задача 11#45078

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

В первой строке входных данных задаётся количество чисел N  (1 ≤ N ≤ 100000)  . В каждой из последующих   N  строк записано одно целое положительное число, не превышающее 10000  .

Пример входных данных:

5

12

12

12

11

13

Выходные данные для приведённого выше примера: 7

В ответе укажите два числа: сначала значение искомого количества для файла A  , затем для файла B  .

Вложения к задаче
Показать ответ и решение
f = open(’27B.txt’)
n = int(f.readline())
ans = 0
kr = [0]*9

for i in range(n):
    x = int(f.readline())
    for j in [8, 4, 2, 1]:
        if x * j % 8 != 0:
            ans += kr[j]

    for j in [8, 4, 2, 1]:
        if x % j == 0:
            kr[j] += 1
            break

print(ans)

Ответ: 158 2848871250

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

Задача 12#42943

На вход программы поступает последовательность из N  натуральных чисел. Необходимо найти количество пар, в которых хотя бы один элемент больше 123  , сумма элементов пары кратна 2  , произведение кратно 24  , а разница между индексами элементов пар больше 3  .

Дан входной файл, который содержит в первой строке количество чисел N  (1 ≤ N ≤ 30  ). Каждая из следующих      N  строк содержит одно натуральное число, не превышающее 10000  . В данной задаче под парой подразумевается два любых элемента последовательности.

В ответе укажите одно число: искомое количество пар.

Вложения к задаче
Показать ответ и решение
f = open(’27_5A.txt’)
n = int(f.readline())
ans = 0
a = []
for i in range(n):
    a.append(int(f.readline()))
for i in range(n):
    for j in range(i + 1, n):
        if (a[i] + a[j]) % 2 == 0 and a[i] * a[j] % 24 == 0:
            if (a[i] > 123 or a[j] > 123) and j - i > 3:
                ans += 1
print(ans)

Ответ: 33

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

Задача 13#42942

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

Дан входной файл, который содержит в первой строке количество чисел N  (1 ≤ N ≤ 30  ). Каждая из следующих      N  строк содержит одно натуральное число, не превышающее 10000  . В данной задаче под парой подразумевается два любых элемента последовательности.

В ответе укажите одно число: сумму элементов.

Вложения к задаче
Показать ответ и решение
f = open(’27_4A.txt’)
n = int(f.readline())
ans = 0
a = []
for i in range(n):
    a.append(int(f.readline()))
for i in range(n):
    for j in range(i + 1, n):
        if (a[i] + a[j]) % 13 == 0 and a[i] * a[j] % 2 == 0:
            ans = max(ans, a[i] + a[j])
print(ans)

Ответ: 3289

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

Задача 14#42941

На вход программы поступает последовательность из N  натуральных чисел. Необходимо найти количество пар элементов, в которых хотя бы один элемент больше 100  , а сумма элементов пары кратна 12  .

Дан входной файл, который содержит в первой строке количество чисел N  (1 ≤ N ≤ 30  ). Каждая из следующих      N  строк содержит одно натуральное число, не превышающее 10000  . В данной задаче под парой подразумевается два любых элемента последовательности.

В ответе укажите одно число: количество искомых пар.

Вложения к задаче
Показать ответ и решение
f = open(’27_3A.txt’)
n = int(f.readline())
ans = 0
a = []
for i in range(n):
    a.append(int(f.readline()))
for i in range(n):
    for j in range(i + 1, n):
        if (a[i] + a[j]) % 12 == 0 and (a[i] > 100 or a[j] > 100):
            ans += 1
print(ans)

Ответ: 29

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

Задача 15#42940

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

Дан входной файл, который содержит в первой строке количество чисел N  (1 ≤ N ≤ 30  ). Каждая из следующих      N  строк содержит одно натуральное число, не превышающее 10000  . В данной задаче под парой подразумевается два любых элемента последовательности.

В ответе укажите одно число: количество искомых пар.

Вложения к задаче
Показать ответ и решение
f = open(’27_2A.txt’)
n = int(f.readline())
ans = 0
a = []
for i in range(n):
    a.append(int(f.readline()))
for i in range(n):
    for j in range(i + 1, n):
        if a[i] * a[j] % (a[i] + a[j]) == 0:
            ans += 1
print(ans)

Ответ: 2

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

Задача 16#42939

На вход программы поступает последовательность из N  натуральных чисел. Необходимо найти количество пар, сумма элементов которых кратна 10  , а произведение элементов кратно 2  .

Дан входной файл, который содержит в первой строке количество чисел N  (1 ≤ N ≤ 30  ). Каждая из следующих      N  строк содержит одно натуральное число, не превышающее 10000  . В данной задаче под парой подразумевается два любых элемента последовательности.

В ответе укажите одно число: количество искомых пар.

Вложения к задаче
Показать ответ и решение
f = open(’27_1A.txt’)
n = int(f.readline())
ans = 0
a = []
for j in range(n):
    a.append(int(f.readline()))
for i in range(n):
    for j in range(i + 1, n):
        if (a[i] + a[j]) % 10 == 0 and a[i] * a[j] % 2 == 0:
            ans += 1
print(ans)

Ответ: 12

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

Задача 17#42780

На вход подается число 5 < n ≤ 20  , а затем последовательность из n  натуральных чисел. Напишите программу, которая находит количество пар элементов, произведение которых не кратно сумме элементов пары, сумма элементов пары кратна 2  и хотя бы один элемент из пары больше 100  при условии, что элементы стоят на расстоянии не меньше 5  , то есть |i− j| ≥ 5  , где i ⁄= j  - номера элементов последовательности.

В первой строке файла 27.txt  находится число (6 ≤ N ≤ 20)  , в следующих N  строках даны элементы последовательности, целые положительные числа, не превышающее 1000  .

В ответе укажите одно число, значение искомого количества для файла.

Вложения к задаче
Показать ответ и решение
f = open("27.txt")
n = int(f.readline())
a = []
for i in range(n):
    a.append(int(f.readline()))
count = 0
for i in range(n - 5):
    for j in range(i + 5, n):
        k1 = a[i] * a[j]
        k2 = a[i] + a[j]
        if k1 % k2 != 0 and k2 % 2 == 0 and (a[i] > 100 or a[j] > 100):
            count += 1
print(count)

Ответ: 59

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

Задача 18#42779

На вход подается число 4 < n ≤ 20  , а затем последовательность из n  натуральных чисел. Напишите программу, которая находит количество пар элементов, произведение которых кратно 12  , сумма кратна 5  и ровно один элемент пары больше 13  при условии, что элементы стоят на расстоянии не меньше 4  , то есть |i− j| ≥ 4  , где i ⁄= j  - номера элементов последовательности.

В первой строке файла 27.txt  находится число (5 ≤ N ≤ 20)  , в следующих N  строках даны элементы последовательности, целые положительные числа, не превышающее 1000  .

В ответе укажите одно число, значение искомого количества для файла.

Вложения к задаче
Показать ответ и решение
f = open("27.txt")
n = int(f.readline())
a = []
for i in range(n):
    a.append(int(f.readline()))
count = 0
for i in range(n - 4):
    for j in range(i + 4, n):
        if a[i] * a[j] % 12 == 0 and (a[i] + a[j]) % 5 == 0 \
            and ((a[i] > 13 and a[j] <= 13) or (a[i] <= 13 and a[j] > 13)):
            count += 1
print(count)

Ответ: 2

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

Задача 19#42778

На вход подается число 3 < n ≤ 20  , а затем последовательность из n  натуральных чисел. Напишите программу, которая находит количество пар элементов, произведение которых кратно 4  и хотя бы один элемент из пары меньше 20  , при условии, что элементы стоят на расстоянии не меньше 3  , то есть |i− j| ≥ 3  , где i ⁄= j  — номера элементов последовательности.

В первой строке файла 27.txt  находится число (4 ≤ N ≤ 20)  , в следующих N  строках даны элементы последовательности, целые положительные числа, не превышающее 1000  .

В ответе укажите одно число, значение искомого количества для файла.

Вложения к задаче
Показать ответ и решение
f = open("27.txt")
n = int(f.readline())
a = []
for i in range(n):
    a.append(int(f.readline()))
count = 0
for i in range(n - 3):
    for j in range(i + 3, n):
        if a[i] * a[j] % 4 == 0 and (a[i] < 20 or a[j] < 20):
            count += 1
print(count)

Ответ: 14

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

Задача 20#42777

На вход подается число 7 < n ≤ 20  , а затем последовательность из n  натуральных чисел. Напишите программу, которая находит количество пар элементов, произведение которых кратно 2  , сумма кратна 15  и хотя бы один элемент из пары больше 20  , при условии, что элементы стоят на расстоянии не меньше 7  , то есть |i− j| ≥ 7  , где i ⁄= j  — номера элементов последовательности.

В первой строке файла 27.txt  находится число (8 ≤ N ≤ 20)  , в следующих N  строках даны элементы последовательности, целые положительные числа, не превышающее 1000  .

В ответе укажите одно число, значение искомого количества для файла.

Вложения к задаче
Показать ответ и решение
f = open("27.txt")
n = int(f.readline())
a = []
for i in range(n):
    a.append(int(f.readline()))
count = 0
for i in range(n - 7):
    for j in range(i + 7, n):
        if (a[i] + a[j]) % 15 == 0 and a[i] * a[j] % 2 == 0\
                and (a[i] > 20 or a[j] > 20):
            count += 1
print(count)

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