Главная страница
Навигация по странице:

  • Задача 57: Утренняя пробежка

  • Задача 58: Объединение отрезков

  • Задача 59: Кассы

  • Заключение

  • Список литературы

  • основы_программирования_на_языке_python. Министерство образования и науки российской федерации федеральное государственное бюджетное образовательное учреждение высшего


    Скачать 208.8 Kb.
    НазваниеМинистерство образования и науки российской федерации федеральное государственное бюджетное образовательное учреждение высшего
    Дата01.02.2022
    Размер208.8 Kb.
    Формат файлаdocx
    Имя файлаосновы_программирования_на_языке_python.docx
    ТипКурсовая
    #348377
    страница8 из 8
    1   2   3   4   5   6   7   8


    Задача 56: a + b == c

    Ограничение по времени работы программы: 1 секунда

    Даны три действительных числа: a, b, c. Проверьте, выполняется ли равенство a+b=c.

    ВХОДНЫЕ ДАННЫЕ

    Даны три числа a, b, c — действительные, положительные, не превосходят 10 и заданы не более, чем с 7 знаками после точки.

    ВЫХОДНЫЕ ДАННЫЕ

    Если равенство a+b=c выполняется, выведите YES, если не выполняется, выведите NO.

    ПРИМЕР

    ввод

    вывод

    2
    3
    7

    NO

    0.1
    0.2
    0.3

    YES

    РЕШЕНИЕ

    Для сравнения двух действительных чисел нужно посчитать модуль разности этих чисел и сравнить их с некоторой константой эпсилон.  Входные данные заданы с точностью 10−7 (два разных входных числа отличаются как минимум на 10−7, поэтому значение эпсилон нужно взять меньшим, чем 10−7. Возьмем значение эпсилон равное 10−8

    a = float(input())
    b = float(input())
    c = float(input())
    if abs(a + b - c) < 1e-8:
        print("YES")
    else:
        print("NO")


    Задача 57: Утренняя пробежка

    Ограничение по времени работы программы: 1 секунда

    В первый день спортсмен пробежал x километров, а затем он каждый день увеличивал пробег на 70% от предыдущего значения. По данному числу y определите номер дня, на который пробег спортсмена составит не менее y километров.

    ВХОДНЫЕ ДАННЫЕ

    На вход программа получает два числа x и y, записанные в одной строке. Числа положительные, действительные, не превосходят 1000, заданы с точностью до шести знаков после запятой.

    ВЫХОДНЫЕ ДАННЫЕ

    Программа должна вывести одно натуральное число — номер дня в который спортсмен пробежал не менее y километров.

    ПРИМЕР

    ввод

    вывод

    10.0 30.0

    4

    1 2.89

    3

    РЕШЕНИЕ

    В цикле домножайте значение x на 1.7, пока оно меньше y. При сравнении действительных чисел нужно использовать эпсилон, можно взять значение эпсилон равное 10−9. 

    EPS = 1e-9
    x, y = map(float, input().split()) 
    n = 1 
    while x < y - EPS: 
       x *= 1.7 
       n += 1 
    print(n)


    Задача 58: Объединение отрезков

    Ограничение по времени работы программы: 2 секунды

    Решая задачу из контрольной по математике, Вася получил ответ в виде объединения N отрезков [Li,Ri] на числовой прямой. Однако, некоторые из этих отрезков могут пересекаться друг с другом, что не слишком нравится Васе. От вас требуется представить Васин ответ в виде объединения минимального количества непересекающихся отрезков.

    ВХОДНЫЕ ДАННЫЕ

    В первой строке входных данных дано число N (1≤N≤30000). В следующих N строках перечислены пары целых чисел Li и Ri (−50000≤Li≤Ri≤50000). Обратите внимание, что концы отрезков могут совпадать, в этом случае отрезок вырождается в точку.

    ВЫХОДНЫЕ ДАННЫЕ

    В первой строке выведите число M — количество отрезков в искомом объединении. В следующих M-строках выведите сами эти отрезки в том же формате, что и во входном файле. Список отрезков необходимо упорядочить по возрастанию левого конца.

    ПРИМЕР

    ввод

    вывод

    4
    0 2
    4 5
    1 3
    5 6

    2
    0 3
    4 6

    РЕШЕНИЕ

    Создадим список событий, добавив туда начала и концы всех данных отрезков. Отсортируем список событий по возрастанию координаты, при равном значении координаты сначала должны идти начала отрезков, потом - концы.

    Пройдем по списку событий, считая количество отрезков, которые пересекаются с текущим положением, при появлении начала отрезка этот счетчик увеличивается на 1, при появлении конца отрезка - уменьшается на 1. Обнаружив место, в котором начинается новый отрезок общего объединения или заканчивается отрезок общего объединения. добавим к ответу координату текущей точки.

    Конец отрезка в объединении соответствует ситуации, когда счетчик числа пересекающихся отрезков стал равен 0. Начало отрезка в объединении соответствует ситуации, когда счетчик числа отрезков стал равен 1, при этом тип текущего события - начало отрезка.

    n = int(input())
    Events = []
    for i in range(n):
        l, r = map(int, input().split())
        Events.append((l, -1))
        Events.append((r, 1))
    Ans = []
    count = 0
    for x, type in sorted(Events):
        count -= type
        if count == 0 or count == 1 and type == -1:
            Ans.append(x)
    print(len(Ans) // 2)
    for i in range(0, len(Ans), 2):
        print(Ans[i], Ans[i + 1])


    Задача 59: Кассы

    Ограничение по времени работы программы: 1 секунда

    На одном из московских вокзалов билеты продают N касс. Каждая касса работает без перерыва определенный промежуток времени по фиксированному расписанию (одному и тому же каждый день). Требуется определить, на протяжении какого времени в течение суток работают все кассы одновременно.

    ВХОДНЫЕ ДАННЫЕ

    Сначала вводится одно целое число N (0
    В каждой из следующих N строк через пробел расположены 6 целых чисел, первые три из которых обозначают время открытия кассы в часах, минутах и секундах (часы — целое число от 0 до 23, минуты и секунды — целые числа от 0 до 59), оставшиеся три — время закрытия в том же формате. Числа разделены пробелами.

    Время открытия означает, что в соответствующую ему секунду касса уже работает, а время закрытия — что в соответствующую секунду касса уже не работает. Например, касса, открытая с 10 ч 30 мин 30 с до 10 ч 35 мин 30 с, ежесуточно работает 300 секунд.

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

    -— на следующий день.

    ВЫХОДНЫЕ ДАННЫЕ

    Требуется вывести одно число — суммарное время за сутки (в секундах), на протяжении которого работают все N касс.

    ПРИМЕР

    ввод

    вывод

    3
    1 0 0 23 0 0
    12 0 0 12 0 0
    22 0 0 2 0 0

    7200

    2
    9 30 0 14 0 0
    14 15 0 21 0 0

    0

    2
    14 00 00 18 00 00
    10 00 00 14 00 01

    1

    РЕШЕНИЕ

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

    Если в какой-то момент количество работающих касс стало равно n, нужно запомнить этот момент в отдельной переменной. Если в какой-то момент количество работающих касс стало n−1 и текущее событие - окончание работы какой-то кассы, то к ответу нужно добавить текущее время минут запомненный момент, когда открылись все кассы.

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

    Также нужно учесть, что если в конце обработки всех событий счетчик числа работающих касс равен n, то это означает, что в полночь следующих суток все n касс открыты и к ответу нужно добавить время, прошедшее с момента, когда открылись все n касс в последний раз до полуночи.

    n = int(input())
    Events = []
    count = 0
    for i in range(n):
        h1, m1, s1, h2, m2, s2  = map(int, input().split())
        t1 = 3600 * h1 + 60 * m1 + s1
        t2 = 3600 * h2 + 60 * m2 + s2
        Events.append((t1, 1))
        Events.append((t2, -1))
        if t1 >= t2:
            count += 1
    ans = 0
    start = 0
    for x, type in sorted(Events):
        count += type
        if count == n:
            start = x
        if count == n - 1 and type == -1:
            ans += x - start
    if count == n:
        ans += 24 * 3600 - start
    print(ans)

    Заключение

    Во время выполнения работы был создан учебно - методический комплекс по изучению языка программирования Python и размещен на labs.tspu.ru.

    В данной работе были рассмотрены такие темы как: комментарии, числа, строки, переменные, типы данных, операторы, функции, модули, структуры данных, списки, словари, множества, кортежи. Также были рассмотрены программное (Python) и методическое (алгоритмы) обеспечение и решен ряд задач:

    • изучены алгоритмы для решения олимпиадных задач;

    • решены олимпиадные задачи с использованием языка программирования Python;

    • разобраны олимпиадные задачи;

    • рассмотрено 59 задач с подробным разбором.

    Материалы учебно - методического комплекса по изучению языка программирования Python можно использовать в кружках по олимпиадному программированию. В перспективе планируется рабочая программа для проведения занятий в таком кружке на основе представленных материалов.


    Список литературы

    CITATION htt \l 1033 : , (1),

    CITATION Рус \l 1049 : , (2),

    CITATION Вом16 \l 1049 : , (3),

    CITATION Pyt16 \l 1033 : , (4),

    CITATION Хаб16 \l 1049 : , (5),

    CITATION Вгл16 \l 1049 : , (6),

    CITATION Кир \l 1049 : , (7),


    1   2   3   4   5   6   7   8


    написать администратору сайта