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

27.04 Пары/тройки чисел, выбрать из каждой пары/тройки число, кратность

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

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

Задача 1#24428

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

Имеется набор данных, состоящий из троек положительных целых чисел. Необходимо разделить числа в тройках на 3 группы, при этом в каждую группу должно попасть ровно одно число из каждой тройки. Группы должны удовлетворять следующим условиям:

1) Сумма чисел в первой группе нечетна

2) Сумма чисел во второй группе нечетна

Определите максимальную возможную сумму чисел в третьей группе.

 

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

В первой строке входного файла находится одно число: N – количество троек чисел. В следующих N строках находятся тройки чисел, которые необходимо разбить на группы.

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

6

8  3  4

4  8  12

9  5  6

2  6  5

12  3  5

1  2  12

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

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

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

Откроем текстовый документ файла A  . Запомним первое число и удалим его. Скопируем все числа в Excel. В ячейке      F 1  запишем формулу =МАКС(A1:C1), растянем её на весь диапазон [F 1 : F 100]  . В ячейке G1  запишем формулу =НАИБОЛЬШИЙ(A1:C1;2), растянем её на весь диапазон [G1 : G100 ]  . В ячейке H1  запишем формулу =НАИБОЛЬШИЙ(A1:C1;3), растянем её на весь диапазон [G1 : G100 ]  . В ячейке F 101  запишем формулу =СУММ(F1:F100), растянем её на диапазон [F 101 : H101 ]  . Видим, что вторая сумма чётная, а третья — нечётная. Значит, чтобы сделать вторую сумму чётной, надо поменять местами числа из первой и второй группы.

В ячейке J1  запишем формулу =F1-G1, растянем её на весь диапазон [J1 : J100]  . В ячейке K1  запишем формулу =F1-H1, растянем её на весь диапазон [K1 : K100 ]  . Теперь отсортируем числа по столбцу J  . Раздел Главная ⇒ Сортировка и фильтр ⇒ Настраиваемая сортировка ⇒ Сортируем по столбцу J  по возрастанию. Видим, что минимальная разница между столбцами находится в ячейке J1  . Значит, чтобы набрать две нечётных суммы, а третью — максимальную, достаточно поменять числа в ячейках F 1  и G1  местами. Получаем ответ: 77489  . Аналогично работаем с файлом B  .

Ответ: 77489 75043145

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

Задача 2#26279

На вход подается натуральное число n  , а затем последовательность из n  натуральных чисел. Напишите программу, которая выводит на экран всевозможные пары чисел. В качестве ответа выведите искомое количество элементов для n = 5  и последовательности 3  4 7 2 5  .

Всевозможные пары подразумевают, что в примере 3 4 5: 3 4 и 4 3 различные пары

Показать ответ и решение
n = int(input())  
array = []  
for i in range(n):  
    array.append(int(input()))  
 
for i in range(n):  
    for j in range(n):  
        print(array[i], array[j])

Ответ: 25

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

Задача 3#26280

На вход подается натуральное число n  , а затем последовательность из n  натуральных чисел. Напишите программу, которая выводит на экран все различные пары чисел. В качестве ответа выведите искомое количество элементов для n = 5  и последовательности 3  4 7 2 5  .

Различные пары подразумевают, что в примере 3 4 5: 3 4 и 4 3 одинаковые пары

Показать ответ и решение
n = int(input())  
array = []  
for i in range(n):  
    array.append(int(input()))  
 
for i in range(n):  
    for j in range(i + 1, n):  
        print(array[i], array[j])

Ответ: 10

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

Задача 4#26281

На вход подается натуральное число n  , а затем последовательность из n  натуральных чисел. Напишите программу, которая выводит на экран все различные тройки чисел. В качестве ответа выведите искомое количество элементов для n = 5  и последовательности 3  4 7 2 5  .

Показать ответ и решение
n = int(input())  
array = []  
for i in range(n):  
    array.append(int(input()))  
 
for i in range(n):  
    for j in range(i + 1, n):  
        for k in range(j + 1, n):  
            print(array[i], array[j], array[k])

Ответ: 10

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

Задача 5#26282

На вход подается натуральное число n  , а затем последовательность из n  натуральных чисел. Напишите программу, которая выводит на экран все различные пары чисел, произведение которых чётно. В качестве ответа выведите искомое количество элементов для n = 5  и последовательности 3 4 7 2 5  .

Показать ответ и решение
n = int(input())  
array = []  
for i in range(n):  
    array.append(int(input()))  
 
for i in range(n):  
    for j in range(i + 1, n):  
        if (array[i] * array[j]) % 2 == 0:  
            print(array[i], array[j])

Ответ: 7

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

Задача 6#26283

На вход подается натуральное число n  , а затем последовательность из n  натуральных чисел. Напишите программу, которая выводит на экран все различные тройки чисел, сумма которых нечётна. В качестве ответа выведите искомое количество элементов для n = 5  и последовательности 3 4 7 2 5  .

Показать ответ и решение
n = int(input())  
array = []  
for i in range(n):  
    array.append(int(input()))  
 
for i in range(n):  
    for j in range(i + 1, n):  
        for k in range(j + 1, n):  
            if (array[i] + array[j] + array[k]) % 2 != 0:  
                print(array[i], array[j], array[k])

Ответ: 4

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

Задача 7#32960

Максим Сергеевич любит большие числа. Сегодня ему дали задачу - из каждой группы чисел нужно выбрать ровно 2 и найти их НОК. После этого находится сумма всех таких НОК. Также известно, что МС любит числа 5 и 7, но не оба одновременно. МС с лёгкостью решил бы эту задачу, но после щелчка ему нужен отдых, и он отправился путешествовать по маршруту Москва-Ярославль-Питер-Ярославль-Москва-Сочи.
Помогите МС. Найдите максимальную сумму НОК из каждой группы чисел, чтобы она делилась либо на 7, либо на 5, но не на оба числа одновременно.
Входные данные:
Даны два входных файла, каждый из которых содержит в первой строке количество чисел N  (2 ≤ N ≤ 100000  ). В каждой из следующих N  строк файлов записан сначала размер группы K  (K  ≤ 10  ), а затем K  натуральных чисел, не превышающих 500.
Пример входного файла:
4
2 8 6
3 2 7 8
2 6 5
4 7 3 8 6
Примечание:
Для указанных входных данных значения НОК для первой группы — 24; для второй группы — 14, 8, 56; для третьей группы — 30, для четвёртой группы — 6, 21, 24, 24, 42, 56. Значением искомой суммы должно быть число 110 (24+14+30+42). В ответе укажите два числа: сначала искомое значение для файла А, затем для файла B.

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

Решение №1.

def evklid(a, b): # поиск НОДа
    if b > a:
        a, b = b, a
    if a != 0 and b != 0:
        return evklid(a % b, b)
    return a + b # одно из чисел = 0

def nok(a, b): # НОК(a, b) = a * b // НОД(a, b)
    return a * b // evklid(a, b)

f = open(’test.txt’)
n = int(f.readline())
ans = [-10000000] * 35
ans[0] = 0
for i in range(n):
    a = [int(x) for x in f.readline().split()] # a[0] - количество элементов
    ans_new = [-10000000] * 35
    for q in range(1, len(a)):
        for k in range(q + 1, len(a)):
            NOK = nok(a[q], a[k])
            for j in range(35):
                ost = (ans[j] + NOK) % 35
                if ans[j] + NOK > ans_new[ost]:
                    ans_new[ost] = ans[j] + NOK
    ans = ans_new.copy()
maxim = -1
for i in ans:
    if (i % 5 == 0 or i % 7 == 0) and i % 35 != 0:
        maxim = max(i, maxim)
print(maxim)

Решение №2.

from math import gcd

def solve(file):
    f = open(file)
    n = int(f.readline())
    curr = [-1] * 35
    curr[0] = 0
    for q in range(n):
        a = list(map(int, f.readline().split()))
        cnt = a[0]
        del a[0]
        temp = [-1] * 35
        for i in range(cnt - 1):
            for j in range(i + 1, cnt):
                x, y = a[i], a[j]
                nod = gcd(x, y)
                nok = x * y // nod
                for k in range(35):
                    if curr[k] == -1:
                        continue
                    ost = (curr[k] + nok) % 35
                    temp[ost] = max(temp[ost], curr[k] + nok)
        curr = temp.copy()

    ans = -1

    for i in range(35):
        if (i % 7 == 0 or i % 5 == 0) and i % 35 != 0:
            ans = max(ans, curr[i])

    print(ans)
    f.close()

solve("27-A.txt")
solve("27-B.txt")

Ответ: 2257416 1254402115

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

Задача 8#36727

Имеется набор данных, состоящий из пар натуральных чисел. Каждая пара чисел представляет собой баллы за ЕГЭ по информатике (1 число) и физике (2 число), соответственно 100 баллов максимум. Необходимо выбрать из каждой пары число такое, что если баллы по физике меньше 60, то взять из пары баллы по информатике, иначе взять баллы по физике. Необходимо найти сумму этих баллов. Программа должна напечатать одно число — сумму, соответствующую условиям задачи.

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

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

5

100 50

30 49

88 79

90 90

79 48

Для указанных входных данных значением искомой суммы должно быть число 378.

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

Вложения к задаче
Показать ответ и решение
    f = open(’B1-3.txt’)
    n = int(f.readline())
    ans = 0
    for i in range(n):
        a, b = map(int, f.readline().split())
        if b < 60:
            ans += a
        else:
            ans += b
    print(ans)

Ответ: 1432 300032

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

Задача 9#36728

Имеется набор данных, состоящий из пар натуральных чисел. Каждая пара чисел представляет собой баллы за ЕГЭ по информатике (1 число) и математике (2 число), соответственно 100 баллов максимум. Необходимо составить рейтинг 3 лучших учеников исходя из их суммы баллов. Программа должна напечатать три числа — 3 суммы баллов учеников по убыванию, начиная с максимальной.

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

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

5

100 50

30 49

88 79

90 90

79 48

Для указанных входных данных выходными значениями должны быть 180 167 150.

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

Вложения к задаче
Показать ответ и решение
    f = open(’B1-3.txt’)
    n = int(f.readline())
    ans = []
    for i in range(n):
        a, b = map(int, f.readline().split())
        ans.append(a+b)
    ans.sort()
    print(ans[len(ans)-1],ans[len(ans)-2],ans[len(ans)-3])

Ответ: 196 196 160 198 198 198

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

Задача 10#36729

Имеется набор данных, состоящий из пар натуральных чисел. Каждая пара чисел представляет собой средние баллы за ЕГЭ мальчиков (1 число) и девочек (2 число) из N-ой городской школы, соответственно 100 баллов максимум. Необходимо определить, в скольких школах количество баллов у мальчиков или у девочек больше, чем 60, и при этом есть хотя бы какая-то группа, балл которой не кратен 7.

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

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

5

100 50

30 49

88 79

90 90

79 48

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

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

Вложения к задаче
Показать ответ и решение
    f = open(’B1-3.txt’)
    n = int(f.readline())
    ans = 0
    for i in range(n):
        a, b = map(int, f.readline().split())
        if (a > 60 or b > 60) and (a % 7 !=0 or b % 7 != 0):
            ans += 1
    print(ans)

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