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

  }

};