10836. Лето

 

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

В начале игры участники делятся на две команды – “ананас и черника.

Во время игры модератор фиксирует моменты времени, когда один игрок делает выстрел в другого. Как и в видеоиграх, за успешные выстрелы начисляются очки.

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

 

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

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

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

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

 

Выход. Выведите два целых числаобщий счёт команды ананас и общий счёт команды черника.

 

Пример входа 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), его команде дополнительно начисляется 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);

 

Команде, к которой принадлежит игрок a, начисляется 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);