Для кожного з гравців будемо зберігати інформацію про час його останнього пострілу. Наприклад, у масиві prevTime[i] будемо записувати момент часу (у секундах), коли гравець зробив свій останній постріл.
Далі послідовно обробляємо всі пострілів. Нехай поточний постріл представлений трійкою (t, a, b). Тоді:
при пострілі команді гравця нараховується очок;
якщо гравець здійснює подвійний постріл (виконується умова t - prevTime[a] \le 10), його команді додатково нараховується очок;
після цього оновлюємо значення prevTime[a] = t, оскільки гравець зробив свій останній постріл в момент часу .
Приклад
У першому прикладі на -й та -й секундах гравець стріляє в гравців та з протилежної команди. За кожен постріл команда "Ананас" отримує по очок. Оскільки обидва постріли були зроблені з різницею не більше секунд, команда отримує додаткові очок. Загалом: 250 = 2 × 100 + 50. Команда "Чорниця" здійснила лише один постріл по супернику і набрала очок.
У другому прикладі гравець зробив два подвійних постріли поспіль, тому команда "Ананас" заробила в сумі 3 × 100 + 2 × 50 = 400 очок.
Реалізація алгоритму
В prevTime[i] будемо зберігати час (у секундах), коли гравець здійснив свій останній постріл.
int prevTime[10];Читаємо кількість пострілів .
scanf("%d", &n);Для кожного гравця початкове значення часу останнього пострілу встановлюємо рівним .
for (i = 1; i < 10; i++)
prevTime[i] = -10000;Очки команд "Ананас" і "Чорниця" будемо зберігати в змінних і відповідно.
pa = pb = 0;Обробляємо всі пострілів.
while (n--)
{Гравець здійснює постріл у гравця в момент часу .
scanf("%d %d %d", &t, &a, &b);Команді, до якої належить гравець , нараховується очок.
if (a < b) pa += 100;
else pb += 100;Якщо гравець здійснює постріл протягом секунд після свого попереднього, його команда отримує додаткові очок.
if (t - prevTime[a] <= 10)
if (a < b) pa += 50;
else pb += 50;Після цього оновлюємо інформацію про те, що гравець здійснив постріл в момент часу .
prevTime[a] = t;
}Виводимо відповідь.
printf("%d %d\n", pa, pb);