eroly12ramblerr2
12.10.2022 12:12

Забобонний Дід Мороз Як відомо, в різні роки чергують і розвозять подарунки різні Діди Морози. Але всі вони забобонні - розвозять подарунки протягом всього року, крім днів, коли на календарі Діді Мороза "П'ятниця 13". Скільки днів Дід Мороз не розвозив подарунки протягом свого чергування?

Вхідні дані
У першому рядку число K - кількість змін чергування Діда Мороза.
Далі у K рядках через пропуск вказано роки А та В, що припадають на зміну. 1920 ≤ A ≤ B ≤ 2050 (за григоріанським календарем).

Вихідні дані
Єдине число - кількість днів, коли Дід Мороз не буде розвозити подарунки.

Нажмите на рекламу ниже и сразу увидите ответ
Популярные вопросы:
Ответ:
anghelina1
28.11.2020 11:10

Идея такая: разбиваем отрезок [a, b] на два: [a, m] и [m, b], где m = (a + b)/2. Длина такого отрезка h = b - a. Cмотрим значения функции f в точках m - ε и m + ε. Если f(m - ε) < f(m + ε), то думаем, что функция возрастает в точке m, и разумно искать ответ на отрезке [a, m]; если f(m - ε) > f(m + ε), то оставляем отрезок [m, b]. Если нам ОЧЕНЬ не повезло, и f(m - ε) = f(m + ε), то оставим отрезок [m - h/4, m + h/4]. При этом в любом случае длина нового отрезка будет h/2. В качестве ε разумно взять желаемую точность, и останавливаться, если новая длина h/2 окажется меньше ε.

Очень маленький ε ставить не следует, при этом очень большую роль начинаю играть ошибки округления.

Точный ответ можно найти, посчитав производную. Должно получиться 1/\sqrt{3}

Реализация (python 3.7):

from math import sqrt

def find_min(function_to_minimize, left, right, tolerance=1e-6):

   assert left <= right

   # print(left, right) # если хотите проследить за тем, как меняются границы

   length = right - left

   if length <= tolerance:

       return left

   midpoint = (left + right) / 2

   y_left, y_right = function_to_minimize(midpoint - tolerance), function_to_minimize(midpoint + tolerance)

   if y_left < y_right:

       return find_min(function_to_minimize, left, midpoint, tolerance)

   elif y_left > y_right:

       return find_min(function_to_minimize, midpoint, right, tolerance)

   else:

       return find_min(function_to_minimize, midpoint - length / 4, midpoint + length / 4)

calculated = find_min(lambda x: x ** 3 - x, 0, 1)

exact = 1 / sqrt(3)

print(calculated)

print(calculated - exact)

Мне выводится ответ 0.5773496627807617

Разница между точным решением и найденным примерно 6\cdot10^{-7}

0,0(0 оценок)
Ответ:
slava31012
20.05.2021 13:55

--- Python 3.8.3 ---

import typing

from typing import List  

class Item:

   def __init__(self, name: str, cost: int):

       self._n = name

       self._c = cost  

   @property

   def Name(self):

       return self._n

   @property

   def Cost(self):

       return self._c  

def Report(data: List[Item]):

   Rep = 'Bought:\n'

   for item in data:

       Rep += f'{item.Name} : {item.Cost} $\n'

   Rep += f'Total cost: {sum([item.Cost for item in data])} $\n'

   return Rep

def main():

   Buy = []

   CurrentCommand = 'Y'

   while CurrentCommand == 'Y':

       print(' new buy ')

       n = input('Name: \n')

       c = int(input('Cost: \n'))

       Buy.append(Item(n,c))

       print(Report(Buy))

       CurrentCommand = input('Continue? Y/N\n')

   

   

if __name__ == "__main__":

   main()

Объяснение:

Все надписи выводятся на английском потому, что мне лень менять раскладку) Суть осталась та же

Некий "товар" описан классом для более удобного доступа к его атрибутам при формировании отчёта.

0,0(0 оценок)
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота