当前位置: 首页 > news >正文

[蓝桥杯]轨道炮

轨道炮

题目描述

小明在玩一款战争游戏。地图上一共有 NN 个敌方单位,可以看作 2D 平面上的点。其中第 ii 个单位在 0 时刻的位置是 (Xi,Yi)(Xi​,Yi​),方向是 DiDi​ (上下左右之一, 用'U'/'D'/'L'/'R' 表示),速度是 ViVi​。

小明的武器是轨道炮,只能使用一次,不过杀伤力巨大。小明可以选择在某个非负整数时刻释放轨道炮,轨道炮一次可以消灭在一条直线 (平行于坐标轴)上的所有敌方单位。

请你计算小明最多能消灭多少敌方单位。

输入描述

输入第一行包含一个整数 NN。

以下 NN 行每行包含 3 个整数 Xi,Yi,ViXi​,Yi​,Vi​,以及一个大写字符 DiDi​。

其中,1≤N≤1000,−106≤Xi,Yi≤106,0≤Vi≤1061≤N≤1000,−106≤Xi​,Yi​≤106,0≤Vi​≤106。

输出描述

输出一个整数代表答案。

输入输出样例

示例

输入

4
0 0 1 R
0 10 1 R
10 10 2 D
2 3 2 L

输出

3

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

总通过次数: 400  |  总提交次数: 544  |  通过率: 73.5%

难度: 困难   标签: 2019, 模拟, 贪心, 国赛

算法思路:坐标分组 + 时间枚举

我们需要找到​​一个整数时刻 t​​ 和​​一条平行于坐标轴的直线​​,使得该直线上敌方单位数量最大化。核心思路如下:

  1. ​运动分解​​:

    • 每个单位在时刻 t 的位置由其初始位置和运动方向决定:
      • R/L:水平移动(x 变化,y 不变)
      • U/D:垂直移动(y 变化,x 不变)
    • 位置公式:
      • x(t)=Xi​±Vi​⋅t(水平移动)
      • y(t)=Yi​±Vi​⋅t(垂直移动)
  2. ​分组统计​​:

    • ​垂直轨道炮(x=c)​​:统计所有单位在 t 时刻的 x 坐标
    • ​水平轨道炮(y=c)​​:统计所有单位在 t 时刻的 y 坐标
    • 最终答案为两种轨道炮消灭单位数的最大值
  3. ​关键优化​​:

    • 通过枚举单位对 (i, j) 计算相遇时间 t:
      • 若速度相同:仅当初始位置重合时始终满足条件
      • 若速度不同:解方程 Xi​+Vxi​​⋅t=Xj​+Vxj​​⋅t(x 方向)
    • 使用 unordered_map 记录每个时刻 t 的重合单位数

C++代码实现

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;int n, mx = 0;// 处理单方向(x或y)
void solve(vector<int>& pos, vector<int>& vel) {for (int i = 0; i < n; ++i) {int cnt = 1;  // 至少包含当前单位iunordered_map<int, int> timeCount; // 记录各时间点的重合数for (int j = i + 1; j < n; ++j) {if (vel[i] == vel[j]) {if (pos[i] == pos[j]) cnt++;mx = max(mx, cnt);} else {int dp = pos[i] - pos[j];int dv = vel[j] - vel[i];// 检查t=dp/dv是否为非负整数if (dv == 0) continue;if (dp % dv != 0) continue;int t = dp / dv;if (t < 0) continue;timeCount[t]++;mx = max(mx, timeCount[t] + cnt);}}}
}int main() {cin >> n;vector<int> X(n), Y(n), V(n);vector<char> D(n);// 读入数据for (int i = 0; i < n; ++i) {cin >> X[i] >> Y[i] >> V[i] >> D[i];}// 初始化方向速度分量vector<int> vx(n, 0), vy(n, 0);for (int i = 0; i < n; ++i) {switch (D[i]) {case 'R': vx[i] = V[i]; break;case 'L': vx[i] = -V[i]; break;case 'U': vy[i] = V[i]; break;case 'D': vy[i] = -V[i]; break;}}// 分别处理x方向和y方向solve(X, vx); // 垂直轨道炮(x=c)int res_x = mx;mx = 0;solve(Y, vy); // 水平轨道炮(y=c)int res_y = mx;cout << max(res_x, res_y) << endl;return 0;
}

代码解析

  1. ​数据结构​​:

    • X, Y, V, D:存储单位初始位置、速度、方向
    • vx, vy:速度分量(水平/垂直方向)
  2. ​核心函数 solve​:

    • ​双层循环​​:枚举所有单位对 (i, j)
    • ​速度相同处理​​(vel[i]==vel[j]):
      • 位置相同时计数器 cnt++
    • ​速度不同处理​​:
      • 解方程 dp=posi​−posj​,dv=velj​−veli​
      • 验证 t=dp/dv 为​​非负整数​
      • 通过 timeCount 哈希表记录各时刻重合数
  3. ​方向处理逻辑​​:

    • 垂直轨道炮:传入 X, vx(x坐标和水平速度)
    • 水平轨道炮:传入 Y, vy(y坐标和垂直速度)

实例验证

​输入​​:

4
0 0 1 R
0 10 1 R
10 10 2 D
2 3 2 L

​执行流程​​:

  1. ​垂直轨道炮(x方向)​​:

    • 单位1和2:速度相同(vx=1)且初始x=0 → cnt=2
    • 单位1和3:t=(0-10)/(0-1)=10 → 记录 timeCount[10]=1
    • 单位2和3:t=(0-10)/(0-1)=10 → timeCount[10]=2
    • ​最大值​​:timeCount[10] + cnt = 2+2 = 3
  2. ​水平轨道炮(y方向)​​:

    • 无初始重合单位
    • 单位1和3:y坐标在t=5时重合(0+0=10-2×5)
    • ​最大值​​:2(单位1和3)
  3. ​最终输出​​:max(3, 2) = 3

测试点设计

测试类型样例输入预期输出验证要点
基础案例题目示例3常规功能
全静止单位所有V=0按初始位置分组速度相同处理
同向同速所有D='R', V相同按初始x坐标分组速度相同逻辑
大范围坐标X/Y=±1e6, V=1e6不超时整数除法优化
无重合单位分散1边界情况

优化建议

  1. ​时间复杂度​​:

    • 当前复杂度 O(N2),N=1000 时 50 万次循环
    • 可用 std::gcd 优化整除判断:
      if (dp % dv != 0) → if (dp % abs(gcd) != 0)
  2. ​空间优化​​:

    • 用 vector 替代哈希表存储预计算的时间点
    • 分方向独立处理减少内存占用
  3. ​工程实践​​:

    • 添加输入验证(坐标范围 -1e6~1e6)
    • 使用 long long 防止乘法溢出
http://www.lqws.cn/news/194023.html

相关文章:

  • Python 构建法律DeepSeek RAG
  • Dubbo学习(一):Dubbo介绍
  • 装载机防撞系统:智能守护,筑牢作业现场人员安全防线
  • win11部署suna
  • 三、元器件的选型
  • python闭包与装饰器
  • 【大厂机试题解法笔记】区间交集
  • Linux文件系统详解:从入门到精通
  • 编译原理笔记
  • ComfyUI 文生图教程,进行第一次的图片生成
  • curl获取ip定位信息 --- libcurl-multi(三)
  • RocketMQ入门5.3.2版本(基于java、SpringBoot操作)
  • c++算法学习5——贪心算法
  • 类Transformer架构
  • 在线OJ项目测试
  • JMM初学
  • 51单片机——计分器
  • 【Go面试陷阱】对未初始化的chan进行读写为何会卡死?
  • 【汇编逆向系列】八、函数调用包含混合参数-8种参数传参,条件跳转指令,转型指令,movaps 16字节指令
  • 第J3-1周:DenseNet算法 实现乳腺癌识别
  • 消防一体化安全管控平台:构建消防“一张图”和APP统一管理
  • 【驱动】Orin NX恢复备份失败:does not match the current board you‘re flashing onto
  • 大模型如何革新用户价值、内容匹配与ROI预估
  • SQLServer中的存储过程与事务
  • 柴油发电机组接地电阻柜的作用
  • 【大模型】大模型数据训练格式
  • UFC911B108 3BHE037864R0108
  • SOC-ESP32S3部分:31-ESP-LCD控制器库
  • 2025年SDK游戏盾实战深度解析:防御T级攻击与AI反作弊的终极方案
  • 在Linux查看电脑的GPU型号