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

HJ164 太阳系DISCO

  • 题目
  • 题解(7)
  • 讨论(12)
  • 排行

中等 通过率:33.93% 时间限制:1秒 空间限制:256M

知识点广度优先搜索(BFS)

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

描述

在一个平行世界的太阳系中,所有行星恰好构成一个长度为 nn 的,按顺时针依次编号为 1,2,…,n1,2,…,n。相邻两颗行星间距离相等,且保证 nn 为偶数。

你位于编号为 aa 的行星,目标是到达编号为 bb 的行星。你可以执行以下三种操作,每次操作均消耗 11 个单位时间:
∙ ∙顺时针移动 xx 颗行星;
∙ ∙逆时针移动 yy 颗行星;
∙ ∙发动一次传送技能(最多可使用 kk 次),将你顺时针移动 n22n​ 颗行星,即跳到正对面的那颗行星。

请你计算,从 aa 行星移动到 bb 行星的最少时间;若无论如何都无法到达,则输出 −1−1。

输入描述:

在一行上输入 66 个整数 n,k,a,b,x,yn,k,a,b,x,y,含义分别为:
∙ ∙n(2≦n≦2×105)n(2≦n≦2×105)——行星数量,且 nn 为偶数;
∙ ∙k(0≦k≦2×105)k(0≦k≦2×105)——技能可使用的最大次数;
∙ ∙a,b(1≦a,b≦n)a,b(1≦a,b≦n)——起点与终点的编号;
∙ ∙x,y(1≦x,y≦n)x,y(1≦x,y≦n)——每次普通移动的距离。

输出描述:

输出一个整数,表示最少所需时间;若无法到达,则输出 −1−1。

示例1

输入:

4 0 1 2 2 1

复制输出:

2

复制说明:

你可以先顺时针移动 x=2x=2 颗行星到达编号 33,再逆时针移动 y=1y=1 颗行星到达编号 22,共耗时 22。

示例2

输入:

4 114514 1 3 1 1

复制输出:

1

复制

示例3

输入:

4 114514 1 2 2 2

复制输出:

-1
#include <iostream> #include <vector> #include <queue> #include <tuple> using namespace std; const int INF = 1e9; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, k, s, t, x, y; cin >> n >> k >> s >> t >> x >> y; --s; --t; // 0-indexed vector<vector<int>> dist(n, vector<int>(2, INF)); vector<vector<int>> min_teleports(n, vector<int>(2, INF)); queue<pair<int, int>> q; dist[s][0] = 0; min_teleports[s][0] = 0; q.push({s, 0}); while (!q.empty()) { auto [u, layer] = q.front(); q.pop(); int current_dist = dist[u][layer]; int current_tp = min_teleports[u][layer]; // 1. Clockwise int v_cw = (u + x) % n; if (current_dist + 1 < dist[v_cw][layer]) { dist[v_cw][layer] = current_dist + 1; min_teleports[v_cw][layer] = current_tp; q.push({v_cw, layer}); } else if (current_dist + 1 == dist[v_cw][layer]) { min_teleports[v_cw][layer] = min(min_teleports[v_cw][layer], current_tp); } // 2. Counter-clockwise int v_ccw = (u - y + n) % n; if (current_dist + 1 < dist[v_ccw][layer]) { dist[v_ccw][layer] = current_dist + 1; min_teleports[v_ccw][layer] = current_tp; q.push({v_ccw, layer}); } else if (current_dist + 1 == dist[v_ccw][layer]) { min_teleports[v_ccw][layer] = min(min_teleports[v_ccw][layer], current_tp); } // 3. Teleport int v_tp = (u + n / 2) % n; int next_layer = 1 - layer; if (current_dist + 1 < dist[v_tp][next_layer]) { dist[v_tp][next_layer] = current_dist + 1; min_teleports[v_tp][next_layer] = current_tp + 1; q.push({v_tp, next_layer}); } else if (current_dist + 1 == dist[v_tp][next_layer]) { min_teleports[v_tp][next_layer] = min(min_teleports[v_tp][next_layer], current_tp + 1); } } int ans = INF; if (min_teleports[t][0] <= k) { ans = min(ans, dist[t][0]); } if (min_teleports[t][1] <= k) { ans = min(ans, dist[t][1]); } if (ans == INF) { cout << -1 << endl; } else { cout << ans << endl; } return 0; }
http://www.jsqmd.com/news/594016/

相关文章:

  • 手把手教你开发电竞护航系统:从零到上线的小程序全流程
  • 【Matlab 六自由度机器人】从理论到实践:笛卡尔与关节空间规划在复杂避障场景下的MATLAB实现与对比
  • 5个技巧让你高效畅玩Switch游戏:开源Ryujinx模拟器全攻略
  • 永磁同步电机(PMSM)速度电流双闭环FOC矢量控制策略详解
  • 解决GLIBC版本冲突:手动编译libcrypto.so.1.0.0的完整指南
  • 保姆级教程:在CentOS 7.9上从源码编译安装nvtop 3.1.0(含CMake 3.29.7依赖安装)
  • 前端CSS精讲05:Grid网格布局——现代页面最强二维布局方案
  • 你的电脑配置,可能决定了Vivado升级时IP会不会“偷懒”:一次关于IP缓存与硬件资源的观察
  • Ubuntu 20.04忘记密码?5分钟搞定root和用户密码重置(附GRUB菜单截图)
  • Avalonia实战:5分钟搞定无边框窗口自定义(附拖拽功能完整代码)
  • 学生评教|高校评教|基于SpringBoot+vue高校学生评教系统 (源码+数据库+文档)
  • 离谱又惊艳!C++隐藏宝藏库numeric_range深度探索,竟藏着JS彩蛋和隐零点
  • 常见的 HTTP 状态码有哪些:从 1xx 到 5xx 全解及排错流程图
  • 五次多项式换道轨迹规划+MPC轨迹跟踪控制simulink模型(有说明文档) 版本
  • 开发实战:asp.net core + ef core 实现动态可扩展的分页方案
  • 电力电子新手必看:SPWM单极性倍频调制在Simulink中的实现与优化
  • 告别数据孤岛:手把手教你用ArcMap的Join功能,把Excel数据精准‘贴’到地图上
  • 用AirSim和Habitat手把手教你搭建第一个无人机VLN仿真环境(避坑指南)
  • 知新研学 |AlignMamba:AlignMamba:通过局部和全局跨模态对齐增强多模态 Mamba 技术
  • HTTP 请求包含哪些内容:请求行、请求头、请求体三大结构及类型详解
  • Doris查询优化指南:PHP开发者必知的5个参数调优技巧
  • 文章标题:专业ASIC FPGA IP加密代码解密工具
  • 快至1天开通企业来电名片!高性价比号码认证服务商推荐(适配中小企业) - 企业服务推荐
  • 从Logistic曲线到疫情预测:用Python和SciPy复现SI传染病模型(附代码)
  • 连登IEEE/Elsevier一区TOP刊!PINN+强化学习新突破!
  • HTTP 2.0 与 HTTP 3.0 核心区别详解:从 TCP 到 UDP,彻底解决队头阻塞
  • **基于ARKit的增强现实手势交互开发实战:从零构建沉浸式用户界面**
  • UG NX 合并曲面减少面得数量
  • HTTP 和 HTTPS 有什么区别:从明文传输到安全加密的完整演进
  • ollama环境变量全解析:从数据路径到端口优化的高效配置指南