Тема 27. Программирование – оптимизация по времени и по памяти

27.07 Прочие прототипы

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

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

Задача 21#45298Максимум баллов за задание: 2

Даны числа K0  , K1  и K2  , которые являются количествами чисел с соответствующими остатками при делении на 3  , указанными в названии. Нужно найти количество подмножеств, сумма элементов которых делится на 3  .

Вложения к задаче
Показать ответ и решение
from math import comb

f = open(’2.txt’)
ans = 0
k = [int(f.readline()) for _ in range(3)]

s2 = [0, 0, 0]
for i in range(3):
    for j in range(i, k[2] + 1, 3):
        s2[i] += comb(k[2], j)

s1 = [0, 0, 0]
for i in range(3):
    for j in range(i, k[1] + 1, 3):
        s1[i] += comb(k[1], j)

ans = s1[0] * s2[0] + s1[1] * s2[1] + s1[2] * s2[2]
ans = ans * 2 ** k[0]

print(ans)

Ответ: 11665337198842730263320011877960647281883570298097132994270776567519749329063338257192070288909533184

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

Задача 22#45300Максимум баллов за задание: 2

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

Вложения к задаче
Показать ответ и решение
from math import comb

f = open(’3.txt’)
n = int(f.readline())
ans = 0
k = [0, 0, 0]

for i in range(n):
    x = int(f.readline())
    k[x % 3] += 1

s2 = [0, 0, 0]
for i in range(3):
    for j in range(i, k[2] + 1, 3):
        s2[i] += comb(k[2], j)

s1 = [0, 0, 0]
for i in range(3):
    for j in range(i, k[1] + 1, 3):
        s1[i] += comb(k[1], j)
ans = s1[0] * s2[0] + s1[1] * s2[1] + s1[2] * s2[2]
ans = ans * 2 ** k[0]

mn = 0  # количество всех множеств
for i in range(n + 1):  # с 0, так как существует пустое множество
    mn += comb(n, i)

print(mn - ans)

Ответ: 845100400152152934147883532288

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

Задача 23#45301Максимум баллов за задание: 2

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

Вложения к задаче
Показать ответ и решение
from math import comb

f = open(’0.txt’)
n = int(f.readline())
ans = 0
k = [0, 0]

for i in range(n):
    x = int(f.readline())
    k[x % 2] += 1

s1 = 0
for j in range(0, k[1] + 1, 2):
    s1 += comb(k[1], j)
ans = s1
ans = ans * 2 ** k[0]

print(ans)

Ответ: 633825300114114700748351602688

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

Задача 24#46260Максимум баллов за задание: 2

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’27B.txt’)
n = int(f.readline())
k = 15
ans = [0]*k
for i in range(n):
    x = int(f.readline())
    ans_new = ans[:] #Аналог ans.copy()

    #Подсчет ответа для уже существующих подмножеств
    for j in range(k):
        ans_new[(j+x) % k] += ans[j]
    #Составление нового множества из одного числа x
    ans_new[x % k] += 1

    #Сохранение нового количества множеств
    ans = ans_new[:]

print(ans[0])

Ответ: 69941 84510040015215293433095698543

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

Задача 25#46263Максимум баллов за задание: 2

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’27A.txt’)
n = int(f.readline())
k = 20
ans = [0]*k
for i in range(n):
    x = int(f.readline())
    ans_new = ans[:] #Аналог ans.copy()

    #Подсчет ответа для уже существующих подмножеств
    for j in range(k):
        ans_new[(j+x) % k] += ans[j]
    #Составление нового множества из одного числа x
    ans_new[x % k] += 1

    #Сохранение нового количества множеств
    ans = ans_new[:]

Ответ: 52431 63382530011411470074835160063

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

Задача 26#46264Максимум баллов за задание: 2

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’27A.txt’)
n = int(f.readline())
k = 100
ans = [0]*k
for i in range(n):
    x = int(f.readline())
    ans_new = ans[:] #Аналог ans.copy()

    #Подсчет ответа для уже существующих подмножеств
    for j in range(k):
        ans_new[(j+x) % k] += ans[j]
    #Составление нового множества из одного числа x
    ans_new[x % k] += 1

    #Сохранение нового количества множеств
    ans = ans_new[:]

print(ans[0])

Ответ: 10476 12676506002282294014968506961

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

Задача 27#46265Максимум баллов за задание: 2

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’27A.txt’)
n = int(f.readline())
k = 256
ans = [0]*k
for i in range(n):
    x = int(f.readline())
    ans_new = ans[:] #Аналог ans.copy()

    #Подсчет ответа для уже существующих подмножеств
    for j in range(k):
        ans_new[(j+x) % k] += ans[j]
    #Составление нового множества из одного числа x
    ans_new[x % k] += 1

    #Сохранение нового количества множеств
    ans = ans_new[:]

print(ans[0])

Ответ: 4096 4951760157141521099596496895

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

Задача 28#46266Максимум баллов за задание: 2

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’27A.txt’)
n = int(f.readline())
k = 1024
ans = [0]*k
for i in range(n):
    x = int(f.readline())
    ans_new = ans[:] #Аналог ans.copy()

    #Подсчет ответа для уже существующих подмножеств
    for j in range(k):
        ans_new[(j+x) % k] += ans[j]
    #Составление нового множества из одного числа x
    ans_new[x % k] += 1

    #Сохранение нового количества множеств
    ans = ans_new[:]

print(ans[0])

Ответ: 1011 1237940039285380274905840612

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

Задача 29#47000Максимум баллов за задание: 2

На вход подается натуральное число N,  затем N  натуральных чисел в порядке неубывания. Определите, есть ли среди чисел число 2555  . В качестве ответа укажите YES  , если искомое число присуствует и N O  в ином случае.

Вложения к задаче
Показать ответ и решение
def bin_search(a, x):
    n = len(a)
    left = -1
    right = n
    while right - left > 1:
        middle = (left + right) // 2
        if a[middle] >= x:
            right = middle
        else:
            left = middle
    if right != n and a[right] == x:
        return True
    else:
        return False

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

print(bin_search(a, 2555))

Ответ: NO

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

Задача 30#47001Максимум баллов за задание: 2

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

Вложения к задаче
Показать ответ и решение
def bin_search(a, x):
    n = len(a)
    left = -1
    right = n
    while right - left > 1:
        middle = (left + right) // 2
        if a[middle] >= x:
            right = middle
        else:
            left = middle
    if right != n and a[right] == x:
        return right
    else:
        return -1

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

print(bin_search(a, 10))

Ответ: 16

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

Задача 31#47002Максимум баллов за задание: 2

На вход подается натуральное число N,  затем N  натуральных чисел в порядке неубывания. Определите, на каком месте в последний раз встречается число 82  . В качестве ответа укажите индекс данного числа в массиве, индексация начинается с 0  .

Вложения к задаче
Показать ответ и решение
def bin_search(a, x):
    n = len(a)
    left = -1
    right = n
    while right - left > 1:
        middle = (left + right) // 2

        if x == a[middle]:
            left = middle

        elif a[middle] >= x:
            right = middle

        else:
            left = middle

    if left != n and a[left] == x:
        return left
    else:
        return -1

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

print(bin_search(a, 82))

Ответ: 196

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

Задача 32#47003Максимум баллов за задание: 2

Найдите решение следующего уравнения с точностью до 10−4  :

x2 = 9999800001

В качестве ответа укажите положительный корень уравнения с точностью до 10−4  , дробную часть укажите через точку (т.е. так: 10.2563  ).

Показать ответ и решение
def fun(x):
    return x**2

def bin_search(c):
    eps = 0.001
    left = 0
    right = 10**15
    while abs(right - left) > eps:
        middle = (left + right) / 2

        if fun(middle) - c < 0:
            left = middle
        else:
            right = middle

    return right

print(bin_search(99999**2))

Ответ: 99999.0004

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

Задача 33#47004Максимум баллов за задание: 2

Найдите максимальное значение функции с точностью до 10− 3  при следующих условиях f(x) = 6x2 − 240x + 3600 → x∈m[a0x,30]

В качестве ответа укажите найденное число, округлив до большего.

Показать ответ и решение
def fun(x):
    return 6*x**2-240*x+3600

def bin_search():
    eps = 0.001
    left = 0
    right = 30
    while abs(right - left) > eps:
        middle = (left + right) / 2

        if fun(middle) < 0:
            left = middle
        else:
            right = middle

    return int(fun(right) + 1)

print(bin_search())

Ответ: 3600

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

Задача 34#47005Максимум баллов за задание: 2

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’27A.txt’)

n = int(f.readline())
a = [int(f.readline()) for i in range(n)]
k = 10
ans = 0

for i in range(1, 2**n):
    t = i
    s = 0
    for j in range(n):
        if t % 2 == 1:
            s += a[j]
        t //= 2

    if s % k == 0:
        ans += 1

print(ans)

Ответ: 104863

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

Задача 35#47006Максимум баллов за задание: 2

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’27A.txt’)

n = int(f.readline())
a = [int(f.readline()) for i in range(n)]
k = 30
ans = 0

for i in range(1, 2**n):
    t = i
    s = 0
    for j in range(n):
        if t % 2 == 1:
            s += a[j]
        t //= 2

    if s % k == 0:
        ans += 1

print(ans)

Ответ: 35275

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

Задача 36#47007Максимум баллов за задание: 2

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’27A.txt’)

n = int(f.readline())
a = [int(f.readline()) for i in range(n)]
k = 100
ans = 0

for i in range(1, 2**n):
    t = i
    s = 0
    for j in range(n):
        if t % 2 == 1:
            s += a[j]
        t //= 2

    if s % k == 0:
        ans += 1

print(ans)

Ответ: 10476

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

Задача 37#47008Максимум баллов за задание: 2

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’27A.txt’)

n = int(f.readline())
a = [int(f.readline()) for i in range(n)]
k = 128
ans = 0

for i in range(1, 2**n):
    t = i
    s = 0
    for j in range(n):
        if t % 2 == 1:
            s += a[j]
        t //= 2

    if s % k == 0:
        ans += 1

print(ans)

Ответ: 8195

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

Задача 38#47009Максимум баллов за задание: 2

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

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

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

Вложения к задаче
Показать ответ и решение
f = open(’27A.txt’)

n = int(f.readline())
a = [int(f.readline()) for i in range(n)]
k = 1000
ans = 0

for i in range(1, 2**n):
    t = i
    s = 0
    for j in range(n):
        if t % 2 == 1:
            s += a[j]
        t //= 2

    if s % k == 0:
        ans += 1

print(ans)

Ответ: 1125

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

Задача 39#48233Максимум баллов за задание: 2

На вход подается натуральное число N,  затем N  натуральных чисел в порядке неубывания. Определите, есть ли среди чисел число 8305  . В качестве ответа укажите YES  , если искомое число присуствует и N O  в ином случае.

Вложения к задаче
Показать ответ и решение
def binary_search_recursive(arr, elem, start=0, end=None):
    if end is None:
        end = len(arr) - 1
    if start > end:
        return False

    mid = (start + end) // 2
    if elem == arr[mid]:
        return mid
    if elem < arr[mid]:
        return binary_search_recursive(arr, elem, start, mid-1)

    return binary_search_recursive(arr, elem, mid+1, end)

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

print(binary_search_recursive(a, 8305))

Ответ: YES

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

Задача 40#48260Максимум баллов за задание: 2

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

Вложения к задаче
Показать ответ и решение
def binary_search_recursive(arr, elem, start=0, end=None):
    if end is None:
        end = len(arr) - 1
    if start > end:
        return False

    mid = (start + end) // 2
    if elem <= arr[mid]:
        return binary_search_recursive(arr, elem, start, mid-1)

    if elem == arr[mid + 1]:
        return mid + 1


    return binary_search_recursive(arr, elem, mid+1, end)

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

print(binary_search_recursive(a, 34))

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