Літо#10836

Літо (Розбір)

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

Далі послідовно обробляємо всі пострілів. Нехай поточний постріл представлений трійкою (t, a, b). Тоді:

Приклад

У першому прикладі на -й та -й секундах гравець стріляє в гравців та з протилежної команди. За кожен постріл команда "Ананас" отримує по очок. Оскільки обидва постріли були зроблені з різницею не більше секунд, команда отримує додаткові очок. Загалом: 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);