首页 > 试题广场 >

太阳系DISCO

[编程题]太阳系DISCO
  • 热度指数:845 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
{\hspace{15pt}}在一个平行世界的太阳系中,所有行星恰好构成一个长度为 n,按顺时针依次编号为 1,2,\dots ,n。相邻两颗行星间距离相等,且保证 n 为偶数。

{\hspace{15pt}}你位于编号为 a 的行星,目标是到达编号为 b 的行星。你可以执行以下三种操作,每次操作均消耗 1 个单位时间:
{\hspace{23pt}}\bullet\,顺时针移动 x 颗行星;
{\hspace{23pt}}\bullet\,逆时针移动 y 颗行星;
{\hspace{23pt}}\bullet\,发动一次传送技能(最多可使用 k 次),将你顺时针移动 \tfrac{n}{2} 颗行星,即跳到正对面的那颗行星。

{\hspace{15pt}}请你计算,从 a 行星移动到 b 行星的最少时间;若无论如何都无法到达,则输出 -1

输入描述:
{\hspace{15pt}}在一行上输入 6 个整数 n,k,a,b,x,y,含义分别为:
{\hspace{23pt}}\bullet\,n\left(2 \leqq n \leqq 2\times 10^{5}\right)——行星数量,且 n 为偶数;
{\hspace{23pt}}\bullet\,k\left(0 \leqq k \leqq 2\times 10^{5}\right)——技能可使用的最大次数;
{\hspace{23pt}}\bullet\,a,b\left(1 \leqq a,b \leqq n\right)——起点与终点的编号;
{\hspace{23pt}}\bullet\,x,y\left(1 \leqq x,y \leqq n\right)——每次普通移动的距离。


输出描述:
{\hspace{15pt}}输出一个整数,表示最少所需时间;若无法到达,则输出 -1
示例1

输入

4 0 1 2 2 1

输出

2

说明

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

输入

4 114514 1 3 1 1

输出

1
示例3

输入

4 114514 1 2 2 2

输出

-1

备注:

头像 Bezime
发表于 2024-12-06 21:49:19
D题的妙妙解法: 时间复杂度 思路: 我这里的点是从 到 。 因为 走两次及以上没有意义(走回来了),将 分两种: 若 答案为从 走到 (等价于从 到 )。 若 =1&preview=true"> 答案取 上面的值 与 从 走到 (等价于从 到 )加上一 最小的 展开全文
头像 丨阿伟丨
发表于 2025-08-29 17:15:08
题目链接 太阳系DISCO 题目描述 在一个由 个行星构成的环形星系中,行星顺时针编号为 到 ( 为偶数)。你从起点行星 出发,目标是到达终点行星 。你有以下三种移动方式,每种都消耗 1 单位时间: 顺时针移动 颗行星。 逆时针移动 颗行星。 传送:顺时针移动 颗行星(即跳到正对面)。 展开全文
头像 草海桐
发表于 2025-09-07 16:40:10
package main import ( "bufio" "fmt" "os" ) /* BFS visited[pos][tp] 表示在位置 pos,使用 tp 次传送的状态是否访问过 tp 只有 0 和 展开全文
头像 牛客754921490号
发表于 2025-12-20 20:43:43
#include <iostream> #include <vector> #include <deque> using namespace std; struct Node { int pt; int k; }; int main() { 展开全文