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

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

Задача 1#63807

Каждые сутки на вокзал прибывает n  электричек. Вам необходимо определить минимальный промежуток времени между прибытием двух разных электричек на основании заданного расписания прибытия электричек.

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

В первой строке задано число n  (1 ≤ n ≤ 10000 )  — количество электричек.

В последующих строках задано n  моментов времени в формате HH:MM  (0 ≤ HH  ≤  23,0 ≤ MM   ≤ 59)  .

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

Выведите одно число — минимальное время в минутах между прибытием двух электричек

Вложения к задаче
Показать ответ и решение
file = open("temp.txt")
n = int(file.readline())
times = [file.readline() for x in range(n)]

minutes = []
for time in times:
    hh, mm = map(int, time.split(’:’))
    minutes.append(hh * 60 + mm)

minutes.sort()

min_interval = minutes[-1] - minutes[0]

for i in range(1, n):
    interval = minutes[i] - minutes[i-1]
    if interval < min_interval:
        min_interval = interval

print(min_interval)

Ответ: 4

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

Задача 2#63794

У Арчи есть 10000  тугриков. Он хочет их эффективно вложить в лимонад. Ему даны цены за 1000  кубометров лимонада за N  дней. Арчи может только один раз купить лимонад в день i  и продать его в один из последующих дней j  (i < j)  . Помогите Арчи определить номера дней для покупки и продажи лимонада, чтобы получить максимальную прибыль. В ответ укажите день покупки и день продажи через пробел.

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

В первой строке файла содержится число дней N  (1 ≤ N  ≤  1000000)  .

В последующих N  строках файла содержатся цены p  (1 ≤ p ≤ 10000)  за 1000  кубометров лимонада в каждый из дней. Дни нумеруются с единицы.

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

Два числа i  и j  — номера дней для покупки и продажи лимонада.

Вложения к задаче
Показать ответ и решение
file = open("temp.txt")
n = int(file.readline())
prices = [int(file.readline()) for x in range(n)]

maxProfit = -1e9
minIndex = 0
left = 0
right = 0

for i in range(1, n):
    purchasePricePerUnit = prices[minIndex] / 1000
    lemonadeThatCanBeBought = 1000 / purchasePricePerUnit
    salePricePerUnit = prices[i] / 1000
    lemonadeThatCanBeSold = lemonadeThatCanBeBought * salePricePerUnit
    profit = lemonadeThatCanBeSold - purchasePricePerUnit * lemonadeThatCanBeBought

    if prices[i] < prices[minIndex]:
        minIndex = i
    elif profit >= maxProfit:
        maxProfit = profit
        left = minIndex + 1
        right = i + 1

print(left, right)

Ответ: 21 92

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

Задача 3#57793

Напишите рекурсивную функцию, которая была бы аналогом функции itertools.combinations with-replacement  . На вход она должна принимать строку и параметр repeat  . На выходе должен получиться тот же самый результат, что и для combinations,  но с доп. строками состоящими из одинаковых символов.

В качестве ответа укажите результат выполнения функции для строки ABC  и параметра repeat = 2  .

Показать ответ и решение
def combinations_with_replacement(ans, s, r):
    if r == 0:
        print(ans)
    elif r <= len(s):
        for i in range(len(s)):
            s_new = ’’
            for j in range(i, len(s)):
                s_new += s[j]

            combinations_with_replacement(ans + s[i], s_new, r - 1)

s = ’ABC’
combinations_with_replacement(’’, s, 2)

Ответ: AA AB AC BB BC CC

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

Задача 4#57792

Напишите рекурсивную функцию, которая была бы аналогом функции itertools.combinations  . На вход она должна принимать строку и параметр repeat  , из элементов которой будут генерироваться сочетания длиной repeat  .

В качестве ответа укажите результат выполнения функции для строки длины 2  для строки ABC  .

Показать ответ и решение
def combinations(ans, s, r):
    if r == 0:
        print(ans)
    elif r <= len(s):
        for i in range(len(s)):
            s_new = ’’
            for j in range(i+1, len(s)):
                s_new += s[j]

            combinations(ans + s[i], s_new, r - 1)

s = ’ABC’
combinations(’’, s, 2)

Ответ: AB AC BC

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

Задача 5#57791

Напишите рекурсивную функцию, которая была бы аналогом функции itertools.permutations  . На вход она должна принимать строку из которой будут генерироваться сочетания длиной repeat  .

В качестве ответа укажите всевозможные перестановки длины 2  для строки AB  .

Показать ответ и решение
def permutations(s, repeat):
    if repeat == 0:
        return [’’]
    result = []
    for i in range(len(s)):
        for perm in permutations(s[:i] + s[i+1:], repeat-1):
            result.append(s[i] + perm)
    return result
s = "AB"
repeat = 2
print(permutations(s, repeat))

Ответ: AB BA

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

Задача 6#57790

Напишите рекурсивную функцию, которая была бы аналогом функции itertools.product  . На вход она должна принимать строку и параметр repeat. В качестве ответа укажите всевозможные строки длины 2  из символов строки ABC  .

Пример: Всевозможные строки из символов строки AB  длиной 2 будут выглядеть как: AA,AB, BA, BB  .

Показать ответ и решение
def product(s, r, ans):
    if r == 0:
        print(ans)
    else:
        for i in range(len(s)):
            product(s, r-1, ans + s[i])

s = ’ABC’
r = 2
ans = ’’
product(s, r, ans)

Ответ: AA AB AC BA BB BC CA CB CC

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

Задача 7#52713

Вам дан массив a = [1, 2, 9, 9, 9, 9, 9, 9, 9], представьте, что этот массив, это целое число 129999999  и прибавьте к этому числу 1  , как теперь будет выглядеть ваш массив? Напишите программу, которая найдет новое состояние массива. Использовать новые массивы запрещено!!!!!!!

В ответе напишите, все элементы измененного массива через запятую (скобки писать не нужно).

Показать ответ и решение
    # Так как явно видно, что единица не сможет переполнить старший
    # разряд, не будем рассматривать случай, когда такое может произойти :)
    # Для такого случая необходимо обнулить все элементы
    # массива и добавить единицу в начало

    a = [1, 2, 9, 9, 9, 9, 9, 9, 9]
    perenos = 1

    for i in range(len(a) - 1, -1, -1):
        tmp = a[i] + perenos
        a[i] = tmp % 10
        perenos = tmp // 10
    print(a)

Ответ: 1, 3, 0, 0, 0, 0, 0, 0, 0

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

Задача 8#52712

Назовем число хорошим, если оно равно сумме всех своих натуральных делителей (кроме самого числа). Проверьте, является ли число 8128  хорошим. В ответе укажите True  , если это так, иначе — F alse  .

Показать ответ и решение
    n = 8128
    summa = 1
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            summa += i
            if i != n // i:
                summa += n // i
    print(summa == n)

Ответ: True

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

Задача 9#52711

Напишите программу, которая определяет, является ли число n  счастливым.

Счастливое число — это число определенное следующим процессом:

  1. Число n  заменяется на сумму квадратов своих цифр.
  2. Пункт 1  повторяется пока n! = 1  или пока цикл не станет бесконечным.
  3. Если n == 1  , то оно счастливое.

В ответе напишите True, если число n = 29  счастливое, иначе — False.

Показать ответ и решение
    def sumNumber(n):
        summa = 0
        while n > 0:
            summa += (n % 10) ** 2

            n //= 10
        return summa


    n = 29
    seen = set()

    while n != 1 and not (n in seen):
        seen.add(n)
        n = sumNumber(n)

    print(n == 1)

Ответ: False

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

Задача 10#52710

В текстовом файле содержится строка, которая содержит 100  заглавных латинских символов, найдите индекс (индексация с 0  ) первого неповторяющегося символа в строке. Если таких символов нет, то в ответе напишите − 1  .

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

Solution 1

    s = open("7.txt").readline()
    letterArray = [0] * 26
    for i in s:
        letterArray[ord(i) - 65] += 1
    ans = -1
    for i in range(len(s)):
        if letterArray[ord(s[i]) - 65] == 1:
            ans = i
            break
    print(ans)

Solution 2

    s = open("7.txt").readline()
    ans = -1
    for i in range(len(s)):
        fl = True
        for j in range(len(s)):
            if j != i and s[i] == s[j]:
                fl = False
                break
        if fl:
            ans = i
            break
    print(ans)

Ответ: 48

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

Задача 11#52709

Текстовый файл содержит строка, в которой содерджится не более чем 1000000  символов. Вам необходимо проверить, является ли данная строка палиндромом. Использовать «фишки» Питона запрещено.

Если строка является палиндромом, то в ответе напишите длину наибольшой последовательность из символов  A  , иначе напишите длину наибольшой последовательность из символов B  .

Вложения к задаче
Показать ответ и решение
    s = open("6.txt").readline()
    fl = True
    for i in range(len(s) // 2):
        if s[i] != s[len(s) - i - 1]:
            fl = False
            break
    if fl:
        findSymbol = ’A’
    else:
        findSymbol = ’B’
    count = 1
    maxim = 1
    for i in range(len(s) - 1):
        if s[i] == s[i + 1] and s[i] == findSymbol:
            count += 1
            maxim = max(maxim, count)
        else:
            count = 1
    print(maxim)

Ответ: 4

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

Задача 12#52708

Текстовый файл содержит 1000  строк, в каждой строке содерджится не более чем 100  символов. Вам необходимо найти самую длинную префиксную подстроку, совпадающую во всех строках. Префиксная подстрока — подстрока, которая всегда начинается с первого символа строки. Для строки ABCD  префиксными подстроками могут являться подстроки A  , AB  , ABC  , ABCD  .

Пример 1:

Набор строк: [Krab,Krabster,Krabsburger]

Результат поиска: Krab

Пример 2:

Набор строк: [Krab,braK,rak]

Результат поиска:

Вложения к задаче
Показать ответ и решение
    a = open("5.txt").readlines()
    minimLengthString = 1000
    for i in a:
        minimLengthString = min(minimLengthString, len(i))
    ans = ""
    for i in range(minimLengthString):
        flag = True
        for j in range(len(a) - 1):
            if a[j][i] != a[j + 1][i]:
                flag = False
                break
        if flag:
            ans += a[0][i]
        else:
            break
    print(ans)

Ответ: ami

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

Задача 13#52707

В текстовом файле содержатся 2  набора чисел. Первый набор содержит 100  сортированных чисел, второй набор содержит 120  сортированных чисел, все числа натуральные, наборы идут друг за другом. Вам необходимо создать массив, который будет содержать числа из двух наборов в отсортированном порядке. В ответе запишите сумму элементов получившегося массива.

Пример:

Первый набор чисел: [1,1,2,2,3]

Второй набор чисел: [1,2,4]

Результат слияния: [1,1,1,2,2,2,3,4]

Вложения к задаче
Показать ответ и решение
    f = open("4.txt")
    n, m = 100, 120
    a = [int(f.readline()) for _ in range(n)]
    b = [int(f.readline()) for _ in range(m)]
    c = []
    i, j = 0, 0
    while i < n and j < m:
        if a[i] < b[j]:
            c.append(a[i])
            i += 1
        else:
            c.append(b[j])
            j += 1
    while i < n:
        c.append(a[i])
        i +=1
    while j < m:
        c.append(b[j])
        j += 1
    print(sum(c))

Ответ: 10864

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

Задача 14#52706

В текстовом файле содержится число k  , а затем набор из 1000  натуральных чисел. Числа идут в отсортированном порядке. Вам необходимо определить, под каким индексом вы можете вставить число k  в данный набор. В ответе напишите подходящий индекс.

В данной задаче при работе с массивами можно использовать только метод append

Пример 1:

Набор: [1,1,2,2,3]  , k = 5  index = 5

Пример 2:

Набор: [1,3,4]  , k = 2  index = 1

Пример 3:

Набор: [1,3,4]  , k = 3  index = 1

Вложения к задаче
Показать ответ и решение
    f = open("3.txt")
    k = int(f.readline())
    last = 0 # последнее рассмотренное число
    ans = -1
    for i in range(1000):
        x = int(f.readline())
        if k > last and x >= k:
            ans = i
            break
        last = x
    if ans == -1:
        ans = 1000
    print(ans)

Ответ: 247

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

Задача 15#52705

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

Пример:

Начальное состояние набора

Набор: [1,1,2,2,3]  5  элементов

Конечное состояние набора

Набор: [1,2,3]  3  элемента

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

Решение 1

    f = open("2.txt")
    a = []
    for i in f:
        a.append(int(i))
    f.close()
    i = 1
    while i < len(a):
        if a[i] == a[i - 1]:
            a.pop(i)
        else:
            i +=1
    print(i)

Решение 2

    f = open("2.txt")
    a = []
    for i in f:
        a.append(int(i))
    f.close()
    indexLastElem = 0
    for i in range(1, 1000):
        if a[indexLastElem] != a[i]:
            a[indexLastElem + 1] = a[i]
            indexLastElem += 1
    print(indexLastElem + 1)

Ответ: 100

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

Задача 16#52704

В текстовом файле содержится набор из 100  различных натуральных чисел, найдите индексы двух чисел (индексация с 0  ), сумма которых равна 199  . В ответе запишите найденные индексы через пробел в порядке возрастания.

Вложения к задаче
Показать ответ и решение
    f = open("1.txt")
    a = []
    for i in range(100):
        a.append(int(f.readline()))

    for i in range(100):
        for j in range(i + 1, 100):
            if (a[i] + a[j] == 199):
                print(i, j)

Ответ: 4 73

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

Задача 17#51537

Вы — начальник в крупной компании, у Вас в подчинении n  сотрудников, которым Вы должны выплатить зарплату за прошедший месяц. В прошедшем месяце было m  недель, в каждой неделе по k  дней. Каждый сотрудник получает ежедневную зарплату, причем она зависит, сколько он работал в тот, или иной день. Вы хотите узнать, сколько сотрудников компании имеют суммарную зарплату за месяц, бОльшую средней месячной зарплаты среди всех сотрудников. Напишите программу, которая решит эту задачу за Вас

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

В первой строке входных данных заданы три целых числа n  , m  и k  (1 ≤ n,m,k ≤ 100  ) — количество сотрудников у Вас в подчинении, количество недель в прошедшем месяце и количество дней в неделе.

Далее заданы n  блоков по m × k  чисел в каждом — зарплаты каждого сотрудника по дням в течение месяца.

Выведите одно число — сколько сотрудников компании имеют суммарную зарплату за месяц, бОльшую средней месячной зарплаты среди всех сотрудников.

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

2  1  1

6

1

Ответ на данный пример:

1

Вложения к задаче
Показать ответ и решение
f = open("file.txt")
n, m, k = map(int, f.readline().split())

mas = [[[0 for j in range(k)] for i in range(m)] for x in range(n)]

for i in range(n):
    for j in range(m):
        mas[i][j] = list(map(int, f.readline().split()))

sred, ans = 0, 0
for i in range(n):
    for j in range(m):
        for x in range(k):
            sred += mas[i][j][x]

sred /= n

for i in range(n):
    salary = 0
    for j in range(m):
        for x in range(k):
            salary += mas[i][j][x]
    if (salary > sred):
        ans += 1

print(ans)

Ответ: 6

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

Задача 18#51485

Куб разлинован на N  × N × N  клеток (1 < N < 17  ). Исполнитель Робот может перемещаться по клеткам, выполняя за одно перемещение одну из трёх команд: вглубь вправо, вглубь влево или вниз. По команде вглубь вправо Робот перемещается в соседнюю правую клетку, по команде вглубь влево он перемещается в соседнюю левую клетку, по команде вниз – в соседнюю нижнюю. То есть, например, для угла 1  робот сможет попасть в углы 5  , 2  , 3  для рисунка ниже. При попытке выхода за границу квадрата Робот разрушается. Перед каждым запуском Робота в каждой клетке куба лежит монета достоинством от 1  до 100  . Посетив клетку, Робот забирает монету с собой; это также относится к начальной и конечной клетке маршрута Робота. Определите максимальную денежную сумму, которую может собрать Робот, пройдя из угла с номером 1  клетки в угол с номером 8  .

Примечание:

Углы куба нумеруются таким образом

PIC

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

В первой строчке входных данных содержится единственное число N  . В следующих N × N  строках содержатся по N  чисел.

Выведите максимальную денежную сумму, которую может собрать робот.

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

2

1 0

0 1

0 0

0 0

Ответ для приведённого примера:

2

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

for i in range(n):
    for j in range(n):
        t = list(map(int, f.readline().split()))
        a[i][j] = t
for i in a:
    print(*i)
dp = [[[0 for k in range(n)] for j in range(n)] for i in range(n)]
dp[0][0][0] = a[0][0][0]
# заполняем грани
for i in range(1, n):
    dp[i][0][0] = dp[i - 1][0][0] + a[i][0][0]
for j in range(1, n):
    dp[0][j][0] = dp[0][j - 1][0] + a[0][j][0]
for k in range(1, n):
    dp[0][0][k] = dp[0][0][k - 1] + a[0][0][k]

# лицевая
for i in range(1, n):
    for j in range(1, n):
        dp[i][j][0] = max(dp[i - 1][j][0], dp[i][j - 1][0]) + a[i][j][0]
# верхняя
for j in range(1, n):
    for k in range(1, n):
        dp[0][j][k] = max(dp[0][j - 1][k], dp[0][j][k - 1]) + a[0][j][k]
# боковая
for i in range(1, n):
    for k in range(1, n):
        dp[i][0][k] = max(dp[i - 1][0][k], dp[i][0][k - 1]) + a[i][0][k]

for i in range(1, n):
    for j in range(1, n):
        for k in range(1, n):
            dp[i][j][k] = max(dp[i - 1][j][k], dp[i][j - 1][k], dp[i][j][k - 1]) + a[i][j][k]

print(dp[n - 1][n - 1][n - 1])
                                                                                                     
                                                                                                     

Ответ: 3659

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

Задача 19#51482

В Берляндии построили новое здание общежития для университета! В него уже заселились студенты, некоторые из которых очень любят слушать громкую музыку после полуночи, что доставляет неудобство всем соседям вокруг. Здание имеет форму прямоугольного параллепипеда, так что соседями для студента считаются все люди, живущие сверху, снизу, слева и справа от него. Cтудент считается невыспавшимся, если хотя бы один из его соседей громко слушает музыку, причем человек, который поставил музыку, выспится, потому что его музыка его не напрягает. Количество подъездов равно N  , количество этажей в подъезде равно M  , количество квартир на этаже L  . По данным о студентах определите, сколько из них выспится?

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

В первой строчке входных данных содержатся 3 числа: N,M, L  . В следующих N × M  строках содержатся по    L  чисел - 1  если студент слушает музыку после полуночи и 0  в противном случае.

Выведите единственное число — количество студентов, которые смогут выспаться.

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

2 2 2

1 0

0 1

0 0

0 0

Пояснение к примеру:

4

Вложения к задаче
Показать ответ и решение
f = open("1.txt")
n, m, l = map(int, f.readline().split())
a = [[[0 for q in range(l)] for j in range(m)] for i in range(n)]
for i in range(n):
    for j in range(m):
        t = list(map(int, f.readline().split()))
        a[i][j] = t

cnt = 0
for i in range(n):
    for j in range(m):
        for k in range(l):
            p = 1
            if (k - 1 >= 0 and a[i][j][k - 1] == 1) or (k + 1 < l and a[i][j][k + 1] == 1) \
            or (i - 1 >= 0 and a[i - 1][j][k] == 1) or (i + 1 < n and a[i + 1][j][k] == 1) \
            or (j - 1 >= 0 and a[i][j - 1][k] == 1) or (j + 1 < m and a[i][j + 1][k] == 1):
                p = 0
            cnt += p

print(cnt)

Ответ: 60

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

Задача 20#51431

Вы — начальник в крупной компании, у Вас в подчинении n  сотрудников, которым Вы должны выплатить зарплату за прошедший месяц. В прошедшем месяце было m  недель, в каждой неделе по k  дней. Каждый сотрудник получает ежедневную зарплату, причем она зависит, сколько он работал в тот, или иной день. Вам предстоит немного пересмотреть зарплаты сотрудников, некоторым добавить денег в какой-либо день, поощрить его за хорошую работу. Ну а некоторым, вычесть некое количество денег за некачественно выполненный проект в определенный день. Затем посчитать общую сумму выплат работникам. Напишите программу, которая решит эту задачу за Вас.

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

В первой строке входных данных заданы три целых числа n  , m  и k  (1 ≤ n,m,k ≤ 100  ) — количество сотрудников у Вас в подчинении, количество недель в прошедшем месяце и количество дней в неделе.

Далее заданы n  блоков по m × k  чисел в каждом — зарплаты каждого сотрудника по дням в течение месяца.

В n × m + 2  -й строке входных данных задано число t  — количество правок в зарплатах сотрудников (1 ≤ t ≤ 100  ).

В следующих t  строках записаны по 4  числа. Первые три числа показывают, у какого сотрудника происходит изменение зарплаты, в какой по счету неделе и в какой день данной недели происходят эти изменения соответственно. Последнее же число показывает, насколько изменилась зарплата текущего сотрудника в определенный день. Заметьте, что изменения могут быть как положительными, так и отрицательными (то есть происходит прибавка или убавка зарплаты).

Выведите одно число — суммарную зарплату всех работников после всех изменений.

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

1  1  1

2

2

1  1  1  2

1  1  1  − 1

Ответ на данный пример:

3

Вложения к задаче
Показать ответ и решение
f = open("file.txt")
n, m, k = map(int, f.readline().split())

mas = [[[0 for j in range(k)] for i in range(m)] for x in range(n)]

for i in range(n):
    for j in range(m):
        mas[i][j] = list(map(int, f.readline().split()))

t = int(f.readline())
for i in range(t):
    a, b, c, d = map(int, f.readline().split())
    # нумерация в массивах начинается с нуля
    mas[a - 1][b - 1][c - 1] += d

ans = 0

for i in range(n):
    for j in range(m):
        for x in range(k):
            ans += mas[i][j][x]

print(ans)

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