Матч
6, Цифровой дисплей (DigitalDisplay)
Цифровые часы отображают время в
формате “DD:DD:DD”, где D – некоторая цифра. Каждая пара цифр представляет
собой количество часов, минут и секунд, однако мы не знаем их позиций на экране
циферблата. Необходимо найти количество способов, которыми можно проинтерпретировать
заданное время.
Минуты и секунды могут принимать
значения от 00 до 59, часы от 01 до 12. Например, строка “21:23:01” может
интерпретироваться как “минуты : секунды : часы” или “секунды : минуты : часы”.
Класс: DigitalDisplay
Метод: int
waysToInterpret(string display)
Ограничения: display содержит в точности 8 символов в
формате “DD:DD:DD”.
Вход. Строка, содержащая время в формате “DD:DD:DD”.
Выход. Количество способов, которыми можно интерпретировать входное
время.
Пример входа
display |
"21:23:01" |
"01:02:03" |
"01:01:59" |
Пример выхода
2
6
4
РЕШЕНИЕ
математика
Задачу можно было бы решать
генерацией всех шести перестановок, проверяя, является ли очередное значение
времени допустимым. Однако задача имеет математическое решение.
Если одно из трех значений больше
59, то ответ 0 (ни одно из возможных показаний часов не является допустимым).
Подсчитаем количество чисел, лежащих в промежутке от 1 до 12. Это количество,
умноженное на 2, и будет ответом задачи. Это следует из того, что количество
минут и часов всегда могут заменять друг друга.
ПРОГРАММА
#include <cstdio>
#include <string>
using namespace std;
class DigitalDisplay
{
public:
int
waysToInterpret(string display)
{
int h,m,s,c=0;
sscanf(display.c_str(),"%d:%d:%d",&h,&m,&s);
if ((h > 59) ||
(m > 59) || (s > 59)) return 0;
if ((h >= 1)
&& (h <= 12)) c++;
if ((m >= 1)
&& (m <= 12)) c++;
if ((s >= 1)
&& (s <= 12)) c++;
return 2*c;
}
};