【蓝桥杯】历届真题 轨道炮(决赛)Java

【资源限制】

内存限制: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);
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值