10836. Лето

 

Бруно и его друзья играют с водяными пистолетами. Они страстные геймеры, поэтому это не обычная игра с водяным пистолетом, а на самом деле очень похожая на видеоигру. Они даже наняли модератора для игры.

В начале игры игроки делятся на две команды: ананаси черника. Во время игры модератор отслеживает моменты времени, когда какой-то игрок совершает выстрел в другого игрока. Как и в видеоиграх, игроки получают очки. Когда игрок из какой-либо команды стреляет в кого-то из противоположной команды, его команда получает 100 очков. Однако, если в течение 10 секунд тот же игрок снова выстрелит в кого-нибудь из противоположной команды, то это засчитывается как двойной выстрел, и его команда получает дополнительные 50 очков. Игрок может выполнить несколько двойных выстрелов подряд, каждое из которых принесет его команде дополнительные 50 очков.

 

Вход. Первая строка содержит количество выстрелов n (1 n 100) во время игры.

Каждая из следующих n строк содержит три целых числа ti, ai, bi (0 ≤ ti ​≤ 1000, 1 ≤ ai, bi 8) указывающих на то что игрок ai совершил выстрел в игрока bi в момент времени ti  (в секундах).

Игроки из команды ананаспронумерованы натуральными числами от 1 до 4. Номера игроков из команды черникапронумерованы натуральными числами от 5 до 8. Игроки ai и bi гарантированно принадлежат к разным командам.

Числа ti различны и упорядочены по возрастанию.

 

Выход. В одной строке выведите два числа: общий результат команды ананаси общий счет команды черника.

 

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

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

3

10 1 6

20 1 7

21 8 1

250 100

 

 

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

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

3

10 2 5

15 2 6

25 2 5

400 0

 

 

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

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

2

10 5 2

11 6 3

0 200

 

 

РЕШЕНИЕ

математика

 

Анализ алгоритма

Для каждого игрока (их у нас 8) будем хранить инфомацию о времени их последнего выстрела. Например, в prevTime[i] будем хранить время в секундах последнего выстрела игрока i.

Последовательно обрабатываем n выстрелов. Пусть текущий выстрел представлен тройкой t, a, b. Тогда:

·        При совершении выстрела команде игрока a начисляется 100 очков;

·        Если игрок a делает двойной выстрел (t – prevTime[a] ≤ 10), то команде игрока a начисляется 50 очков;

·        Присваиваем prevTime[a] = t, игрок a совершил свой последний выстрел в момент времени t;

 

Пример

В первом примере на секундах 10 и 20 игрок 1 совершает выстрел в игроков 6 и 7 из другой команды. За каждый выстрел ананас получает 100 очков. Поскольку оба выстрела произошли в течение 10 секунд, команда получила дополнительно 50 очков (250 = 2 100 + 50). Команда черника выстрелила только в одного игрока из команды соперника, поэтому набрала всего 100 очков.

Во втором примере игрок 2 выполнил два двойных выстрела подряд, поэтому команда ананас получила в сумме 3 100 + 2 50 = 400 очков.

 

Реализация алгоритма

В prevTime[i] будем хранить время в секундах последнего выстрела игрока i.

 

int prevTime[10];

 

Читаем количество выстрелов n.

 

scanf("%d", &n);

 

Для каждого игрока время последнего выстрела изначально устанавливаем равным -∞.

 

for (i = 1; i < 10; i++)

  prevTime[i] = -10000;

 

Результаты команд ананаси черника подсчитываем в переменных pa и pb.

 

pa = pb = 0;

 

Обрабатываем n выстрелов.

 

while (n--)

{

 

Игрок a совершает выстрел в игрока b в момент времени t.

 

  scanf("%d %d %d", &t, &a, &b);

 

Команде, которая произвела выстрел, начисляется 100 очков.

 

  if (a < b) pa += 100;

  else pb += 100;

 

Если игрок a совершает выстрел в течение 10 секунд, то соответствующая команда получает 50 бонусных очков.

 

  if (t - prevTime[a] <= 10)

    if (a < b) pa += 50;

    else pb += 50;

 

Заносим информацию о том что игрок a совершил выстрел в момент времени t.

 

  prevTime[a] = t;

}

 

Выводим ответ.

 

printf("%d %d\n", pa, pb);