题目描述
小张在玩一款战争游戏。地图上一共有 N 个敌方单位,可以看作 2D 平面上的点。其中第 i 个单位在 0 时刻的位置是 (Xi,Yi),方向是 Di (上下左右之一, 用'U'/'D'/'L'/'R' 表示),速度是 Vi。
小张的武器是轨道炮,只能使用一次,不过杀伤力巨大。小张可以选择在某个非负整数时刻释放轨道炮,轨道炮一次可以消灭在一条直线 (平行于坐标轴)上的所有敌方单位。
请你计算小张最多能消灭多少敌方单位。
输入描述
输入第一行包含一个整数 N。
以下 N 行每行包含 3 个整数 Xi,Yi,Vi,以及一个大写字符 Di。
其中,1 ≤ N ≤ 1000,−10^6 ≤ Xi,Yi≤ 10^6,0 ≤ Vi ≤ 10^6。
输出描述
输出一个整数代表答案。
输入输出样例
示例
输入
4
0 0 1 R
0 10 1 R
10 10 2 D
2 3 2 L
输出
3
思路:
1.首先横向射和纵向射是分立的问题,可以分别解决然后取最大值。
2.单个方向上问题就是:给定初始位置和速度,求一个时间和位置使得在这个时间和位置上重合的点最多。
3.因为n只有1000,两两求出相遇时间以及位置,取答案最大的时间和位置即可。
参考代码:
N = int(input())
X = [0 for _ in range(1010)] #初始化为0
Y = [0 for _ in range(1010)]
vx = [0 for _ in range(1010)]
vy = [0 for _ in range(1010)]
for i in range(N):
data = input().split()
X[i] = int(data[0])
Y[i] = int(data[1])
if data[3] == 'U':
vy[i] = int(data[2])
elif data[3] == 'D':
vy[i] = -1*int(data[2])
elif data[3] == 'R':
vx[i] = int(data[2])
elif data[3] == 'L':
vx[i] = -1*int(data[2])
def f(p,v):
mx = 0
for i in range(N):
time = {}
cnt = 1
for j in range(i+1,N):
if v[i] == v[j]: #i、j点速度一致
if p[i]==p[j]: #i、j点位置一致
cnt +=1
mx = max(mx,cnt)
continue
dx = p[i]-p[j] #i与j之间的距离
dv = v[j]-v[i] #
t = dx//dv #在一个整数时刻 t 两者会重逢
if dx%dv or t<0:
continue
time[t] = time.get(t,0)+1
mx = max(mx,time[t]+cnt)
return mx
mx = max(f(X,vx),f(Y,vy))
print(mx)