Матч
16, Пропущенный звонок (MissedCall)
Виктор прослушивает свой музыкальный
альбом из n
песен. Каждая песня звучит songDuration секунд, пауза между песнями
составляет 5 секунд. В начале прослушивания (в момент времени 0) зазвонил
телефон. Телефон звонит через каждые delay секунд, длительность каждого звонка
составляет 1 секунду. Например, если delay = 3, то телефон звонит в 0, 3, 6, …
секунду. Виктор слышит телефонный звонок, если в этот момент не играет музыка.
Найти наименьшее значение времени в секундах, в которое Виктор услышит
телефонный звонок. Музыкальный альбом звучит только один раз, поэтому после его
прослушивания Виктор обязательно будет слышать телефонный звонок.
Класс: MissedCall
Метод: int waitingTime(int n, int songDuration, int delay)
Ограничения:
1 £ n, delay £ 20, 1 £ songDuration
£ 180.
Вход. Количество песен n в альбоме, длительность каждой песни songDuration,
период между телефонными звонками delay.
Выход. Наименьшее значение времени в секундах, в которое Виктор
услышит телефонный звонок.
Пример входа
n |
songDuration |
delay |
2 |
5 |
7 |
4 |
5 |
20 |
6 |
9 |
20 |
Пример выхода
7
40
40
РЕШЕНИЕ
моделирование
Будем моделировать процесс
прослушивания песен и звонков телефона. Поскольку песен не более 20,
длительность каждой песни не более 180, то весь альбом будет звучать не дольше
чем 20 * (180 + 5) = 3700 секунд. Телефонный звонок раздается в секунды 0, delay,
2*delay,
… . В i - ую секунду звонит телефон,
если delay % i = 0. Научимся определять, играет ли музыка в i - ую секунду.
Исполнение
songDuration
секундной мелодии плюс 5 секундный интервал будем называть периодом песни.
Музыка играет в каждые songDuration секунд периода. То есть музыка не
играет в i - ую секунду, если i % (songDuration + 5)) ³ songDuration. Не следует также забывать, что до (n * (songDuration
+ 5) – 5) - ой секунды все песни
альбома будут проиграны и начиная с нее музыка звучать не будет.
ПРОГРАММА
#include <stdio.h>
class MissedCall
{
public:
int waitingTime(int
n, int songDuration, int delay)
{
for(int i=0;;i++)
if ((i % delay ==
0) && (((i % (songDuration + 5)) >= songDuration )
|| (i >= n * (songDuration + 5) - 5))) return i;
}
};