Матч 390, Подсчет пальцев (FingerCounting)

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

 

Мальчик считает пальцы на руке, начиная с большого до мизинца. Дойдя до мизинца, он считает в обратном порядке: безымянный, средний, указательный, большой. И так далее. Например, при подсчете до 10 будут перечислены следующие пальцы: большой, указательный, средний, безымянный, мизинец, безымянный, средний, указательный, большой, указательный. Пальцы нумеруются с 1 до 5, начиная с большого. Палец с номером weakFinger больной, поэтому его считать можно не более maxCount раз. Найти наибольшее число, до которого может досчитать мальчик.

 

Класс: FingerCounting

Метод: int maxNumber(int weakFinger, int maxCount)

Ограничения: 1 £ weakFinger £ 5, 0 £ maxCount £ 105.

 

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

 

Выход. Наибольшее число, до которого может досчитать мальчик.

 

Пример входа

weakFinger

maxCount

2

3

5

0

5

973

 

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

15

4

7788

 

 

РЕШЕНИЕ

моделирование

 

Будем моделировать процесс, выписывая номера считаемых пальцев: 1, 2, 3, 4, 5, 4, 3, 2, 1, 2, … . Полученная последовательность имеет период 8. Заведем массив fingers[] = {1, 2, 3, 4, 5, 4, 3, 2}. Тогда при подсчете i - ым будет палец с номером fingers[i % 8]. В ячейке count[i]  заносим количество раз, которое будет посчитан  i - ый палец. Как только больной палец weakFinger будет подсчитан maxCount раз, заканчиваем счет.

 

ПРОГРАММА

 

#include <stdio.h>

 

int fingers[] = {1,2,3,4,5,4,3,2};

int count[6], ptr, res;

 

class FingerCounting

{

public:

  int maxNumber(int weakFinger, int maxCount)

  {

    for(res = ptr = 0; count[weakFinger] <= maxCount;ptr++, res++)

      count[fingers[ptr%8]]++;

    return res - 1;

  }

};