Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Задача "Игра Стрельба-2"

Аркадий Паровозов Ученик (59), на голосовании 1 месяц назад
Коля играет в одну простую игру под названием «Стрельба 2». Игра заключается в следующем – есть персонаж, который передвигается в плоском мире со скоростью М клеток в секунду и умеет стрелять из пистолета. Первоначально персонаж начинает движение с координаты 0 (двигаясь по одномерной оси) и имеет пистолет, который может достигать цели при стрельбе с расстояния K клетки, притом производя по U выстрелов в секунду, наносящих по 1 единицы урона. Также заранее известны координаты всех препятствий и их очки здоровья (ОЗ). Также на оси есть туманные области, которые не являются препятствиями, но стрельба через них понижает атаку персонажа в 2 раза нацело (если выстрел наносил 1 единицу урона, то будет 0; если 2, то 1; если 3, то 1; и т.д.).


Помогите Коле определить расстояние, которое пройдёт его персонаж по заданным входным параметрам.

Входные данные:

На вход на первой строке подаётся целое число L (1 <= L <= 100000) – длина оси, по которой будет передвигаться персонаж, целое число K (1 <= K <= L), целое число U (1 <= U <= 1000), целое число М (1<=М<=1000).

На второй строке подаётся целое число N (1 <= N <= 1000) – количество разрушаемых препятствий на оси.

Далее на N строках подаются целые координаты препятствий (целое число от 1 до L-1) и их ОЗ через пробел (например, 5 2, на координате 5 стоит препятствие с 2 ОЗ).

После на новой строке подаётся целое число D (1 <= D <= 1000) – количество туманных областей на оси.

Далее на D-строках подаются целые координаты тумана на оси (одно число от 1 до L-1).


Выходные данные:
На выходе требуется вывести одно целое число – расстояние, которое пройдёт персонаж.


Примечания.

1) Если персонаж проходит весь маршрут, то вывести L.

2) Когда персонаж не доходит до конца (упирается в препятствие, которое не успел уничтожить), то считается, что он прошёл ровно такое расстояние, на координате которой стояло препятствие (если персонаж закончил игру на препятствии по координате 9, то считается, что он прошёл 9 клеток).

3) Если при стрельбе пуля пролетает больше чем через одну туманную область, то считаем, что на её урон влияет только первая.

4) Персонаж каждую секунду останавливается и производит U выстрелов, если выстрел уничтожает цель и остались ещё выстрелы, которые могут долететь до следующего препятствия, то ему наносится урон.


Пример:

Входные данные
15 3 1 1
3
3 3
5 2
9 6
Выходные данные
1
4
5


Рассмотрим пример

Персонаж начинает с координаты 0, на расстоянии 3 есть препятствие с 3 ОЗ.

Персонаж сразу же может начать стрелять, так как расстояние K=3.

Придя на координату 3 – это препятствие будет уничтожено.

Далее есть препятствие по координате 5, но оно за туманом по координате 4, поэтому урон при стрельбе через него понижается нацело на 2 (1 единица урона становится равной 0). Прежний урон (1 ОЗ за выстрел) вернётся только после прохождения тумана (на координате 4). Но уничтожить препятствие он не успеет, так как требуется произвести 2 выстрела, а стреляет он раз в секунду, поэтому, игра закончится на расстоянии 5.
Голосование за лучший ответ
Ингерманландец Гуру (3093) 2 месяца назад
 def solve(): 
l, k, u, m = map(int, input().split())
n = int(input())
obstacles = {}
for _ in range(n):
coord, health = map(int, input().split())
obstacles[coord] = health
d = int(input())
fog_coords = set()
for _ in range(d):
fog_coords.add(int(input()))

position = 0
total_distance = 0
while position < l:
total_distance += m


num_shots = u

for i in range(1, k + 1):
target_position = position + i
if target_position in obstacles:
if num_shots > 0 :
obstacles[target_position] -= 1
num_shots -= 1
if obstacles[target_position] <= 0:
del obstacles[target_position]



next_position = position + m





if next_position < l:






for i in range(position+1, next_position+1):

if i in obstacles:





break
else:

position = next_position
continue












for fog_coord in fog_coords:
if position < fog_coord <= position + m:

for i in range(1, k+1):
target_position = position + i
if target_position in obstacles:
obstacles[target_position] = max(0, obstacles[target_position] -2)

if obstacles[target_position] <= 0:
del obstacles[target_position]

break




position = next_position

if next_position in obstacles and next_position != l:



if len(obstacles.keys()) > 0 and next_position != l:




break








print(min(total_distance, l))

solve()
Похожие вопросы