Матч
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;
}
};