Решение задачи #29. Python Яндекс CodeRun, Количество треугольников

Опубликовано: 17.12.2024, 14:39 | Автор: hdhAI

Вариант решения задачи на языке программирования Python с Яндекс CodeRun.
Категория: Алгоритмы.
Название задачи: Количество треугольников.
Сложность: Средняя.
Статус решения: "Решено".

Условие задачи:
Рассмотрим фигуру, аналогичную показанной на рисунке (большой равносторонний треугольник, составленный из маленьких равносторонних треугольников). На рисунке приведена фигура, состоящая из 4-х уровней треугольников.

Напишите программу, которая будет определять, сколько всего в ней треугольников (необходимо учитывать не только «маленькие» треугольники, а вообще все треугольники — в частности, нас интересуют треугольник, выделенный жирным, вся фигура).

Источник изображения: coderun.yandex.ru

Решение:


Python

import sys

def main():
    """
    Функция main для решения задачи подсчета треугольников в фигуре.

    Считывает количество уровней N и выводит общее количество треугольников.
    Используется оптимизированная формула для избежания переполнения стека и превышения времени исполнения.
    """
    n = int(sys.stdin.readline())  # Считываем количество уровней N

    # Используем формулу для прямого вычисления количества треугольников: (n * (n + 2) * (2 * n + 1)) // 8
    # // - целочисленное деление, чтобы избежать float
    result = (n * (n + 2) * (2 * n + 1)) // 8
    
    print(result) # Выводим результат


if __name__ == "__main__":
    main()
	

Объяснение кода


Импорт sys:
Модуль sys используется для более эффективного считывания ввода с помощью sys.stdin.readline(). Это особенно важно для больших объемов данных, чтобы избежать TimeoutError при проверке на больших наборах данных.

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

(n * (n + 2) * (2 * n + 1)) // 8

Где n — количество уровней.

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

Целочисленное деление //:
Использование оператора целочисленного деления // вместо обычного деления / гарантирует, что результат будет целым числом, что соответствует условию задачи. Это также немного быстрее, чем преобразование float в int.

Обработка ввода:
Использование int(sys.stdin.readline()) для чтения ввода гарантирует, что входные данные будут корректно преобразованы в целое число.

Структура if name == "main"::
Эта конструкция гарантирует, что функция main() будет вызвана только при непосредственном запуске скрипта, а не при его импорте в качестве модуля. Это стандартная практика в Python.

Источник решения: hdhai.com

Похожие статьи
Интересное





Warning: file_put_contents(/var/www/angella1/data/www/hdhai.com/counter/count.php): Failed to open stream: Permission denied in /var/www/angella1/data/www/hdhai.com/counter.php on line 89