Матч 177, Лестница (Stairs)

Дивизион 2, Уровень 1

 

Лестница состоит из набора ступенек. Каждая ступенька характеризуется высотой и длиной. Лестница начинается и заканчивается подъемом и выглядит следующим образом:

                +........

                |

            +---+

            |

        +---+

        |

........+

Ступеньки лестницы удовлетворяют следующим условиям:

1. Все высоты ступенек одинаковы  (равны одному и тому же целому числу);

2. Все длины ступенек одинаковы (равны одному и тому же целому числу);

3. Высота каждой ступеньки должна быть не больше maxHeight;

4. Длина каждой ступеньки должна быть не меньше minWidth;

Высота всей лестницы равна totalHeight (высота всех ступенек), длина – totalWidth (длина всех ступенек).

 

Класс: Stairs

Метод: int designs(int maxHeight, int minWidth,

                   int totalHeight, int totalWidth)

Ограничения: 1 £ maxHeight, minWidth, totalHeight, totalWidth £ 1000.

 

Вход. Максимально возможная высота ступеньки maxHeight, минимально возможная длина ступеньки minWidth, суммарная высота ступенек totalHeight и суммарная длина ступенек totalWidth.

 

Выход. Количество разных лестниц, которое можно построить согласно входным данным.

 

Пример входа

maxHeight

minWidth

totalHeight

totalWidth

22

25

100

100

25

25

60

100

1000

1

600

600

 

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

1

2

6

 

 

РЕШЕНИЕ

перебор

 

Переберем все возможные высоты тупенек i, которые могут изменяться от 1 до maxHeight. Количество подъемов в лестнице равно totalHeight / i, то есть  totalHeight должно нацело делиться на i. Число горизонтальных частей в лестнице на 1 меньше числа подъемов и равно cnt = totalHeight / i – 1. Длина ступенек является натуральным числом (totalWidth должно делиться на cnt), а также быть не меньшей minWidth. Если для очередной высоты i все указанные условия выполняются, то лестница с подъемом ступенек i существует. В переменной res подсчитываем количество таких лестниц.

 

ПРОГРАММА

 

#include <stdio.h>

 

class Stairs

{

  public:

  int designs(int maxHeight, int minWidth, int totalHeight, int totalWidth)

  {

    int i, cnt, res = 0;

    for(i = 1; i <= maxHeight; i++)

    {

      if(totalHeight % i) continue;

      cnt = totalHeight / i - 1;

      if(cnt == 0 || totalWidth % cnt || totalWidth / cnt < minWidth)

         continue;

      res++;

    }

    return res;

  }

};