【资源限制】
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
【问题描述】
小明在玩一款战争游戏。地图上一共有Ⅳ个敌方单位,可以看作2D平面上的点。其中第i个单位在0时刻的位置是(Xi,Y),方向是 Di(上下左右之一,用'U'/'D'/L'/'R’表示),速度是Vi。
小明的武器是轨道炮,只能使用一次,不过杀伤力巨大。小明可以选择在某个非负整数时刻释放轨道炮,轨道炮一次可以消灭在一条直线(平行于坐标轴)上的所有敌方单位。
请你计算小明最多能消灭多少敌方单位。
【输入格式】
输入第一行包含一个整数N。
以下N行每行包含3个整数Xi,Yi,V,以及一个大写字符Di。
【输出格式】
输出一个整数代表答案。
【样例输入】
4
0 0 1 R
0 10 1 R
10 10 2 D
2 3 2 L
【样例输出】
3
【评测用例规模与约定】
对于所有评测用例,1≤N ≤1000,-1000000 ≤ Xi,Yi ≤1000000,0 ≤ Vi≤1000000。
【代码(官方题解)】
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
static int X[], Y[], vx[], vy[];
static int mx = 0;
static int n;
static int m[];
static void f(int X[], int vx[]) {
for (int i = 1; i < n; i++) {
int cnt = 1;
ArrayList list=new ArrayList();
for (int j = i + 1; j <= n; j++) {
if (vx[i] == vx[j]) {
if (X[i] == X[j])
cnt++;
mx = Math.max(cnt, mx);
continue;
}
int dx = X[i] - X[j], dv = vx[j] - vx[i];
int t = dx / dv;
if (dx % dv != 0 || t < 0) {
continue;
}
m[t]++;
if(!list.contains(t)) {
list.add(t);
}
mx = Math.max(mx, m[t] + cnt);
}
for(int j=0;j<list.size();j++) {
m[(int) list.get(j)]=0;
}
}
}
public static void main(String[] args) {
{
m = new int[1000000];
Scanner in = new Scanner(System.in);
n = in.nextInt();
X = new int[1001];
Y = new int[1001];
vx = new int[1001];
vy = new int[1001];
for (int i = 1; i <= n; i++) {
int v;
char d;
X[i] = in.nextInt();
Y[i] = in.nextInt();
v = in.nextInt();
d = in.next().charAt(0);
if (d == 'R') {
vx[i] = v;
}
if (d == 'L') {
vx[i] = -v;
}
if (d == 'U') {
vy[i] = v;
}
if (d == 'D') {
vy[i] = -v;
}
}
f(X, vx);
f(Y, vy);
System.out.println(mx);
}
}
}