Zjh080510 2024-05-05 12:07 采纳率: 50%
浏览 6
已结题

寻宝之路c++的题解

A. 寻宝之路
时间限制: 1000ms
空间限制: 262144kb
题目描述
苦苦寻宝三十载,你发现了一座古墓。

这座墓是一个环状结构,共有
𝑛
n 间室,第
𝑖
i 与第
𝑖
+
1
i+1 间室,第
𝑛
n 与第
1
1 间室之间有可双向通行的小道。

入口联通第
1
1 间室,价值连城的宝藏在第
𝑥
x 间室。

通过一条小道需要
1
1 分钟。拿起宝藏不需要时间。

你现在已经从入口走到了第
1
1 间室,想知道最快需要多少分钟才能拿起宝藏并回到第
1
1 间室。

输入格式
本题有多组测试数据。

第一行输入一个数
𝑇
T,表示数据组数。

接下来
𝑇
T 行,每行两个正整数代表
𝑛
n 和
𝑥
x,表示一组数据。

输出格式
对于每组数据输出一行一个正整数,代表至少需要多少分钟才能拿到宝藏并回到第
1
1 间室。

样例
Input 1
5
4 2
4 4
100000 50
100000 54321
1000000000 987654321
Output 1
2
2
98
91360
24691360
数据范围
本题采用捆绑测试。

Subtask1(30pts),
𝑛

20
n≤20;

Subtask2(20pts),
𝑛

1
0
5
n≤10
5

𝑥

50
x≤50;

Subtask3(20pts),
𝑛

1
0
5
n≤10
5

Subtask4(30pts),无特殊限制。

对于所有数据,
1

𝑇

20
1≤T≤20,
1

𝑥

𝑛

1
0
9
1≤x≤n≤10
9

样例解释
对于样例中的第一组数据,可以直接从第
1
1 间室移动到第
2
2 间室再直接返回,耗时
2
2 分钟。

评测规则
1
​咋写?

  • 写回答

5条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-05-05 12:07
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    题目描述 苦苦寻宝三十载,你发现了一座古墓。 这座墓是一个环状结构,共有n间室,第ii与第i+1i+1间室,第nn与第11间室之间有可双向通行的小道。 入口联通第11间室,价值连城的宝藏在第xx间室。 通过一条小道需要11分钟。拿起宝藏不需要时间。 你现在已经从入口走到了第11间室,想知道最快需要多少分钟才能拿起宝藏并回到第11间室。 输入格式 本题有多组测试数据。 第一行输入一个数T,表示数据组数。 接下来T 行,每行两个正整数代表n和x,表示一组数据。 输出格式 对于每组数据输出一行一个正整数,代表至少需要多少分钟才能拿到宝藏并回到第11间室。 样例 输入样例1: 5 4 2 4 4 100000 50 100000 54321 1000000000 987654321 输出样例1: 2 2 98 91360 24691360 算法 (BFS) $O(n)$ tip:最短路问题,可以尝试使用广度优先搜索算法BFS,用queue辅助, python语言优先考虑deque python3 代码 C++ 代码 python BFS做法,用的是list中pop(0)的方法,速度比较慢,但思路通俗易懂。 from collections import deque x = deque() while True:
    try:
        n, m = map(int, input().split())
    except Exception:
        break
    x.append((n, m))
    

    xxx = x while len(x) != 0: n, m = x.pop(0) visited = [False for i in range(n + 1)] distance = [1e9 for i in range(n + 1)] distance[1] = 0 visited[1] = True XX = [] for xx in range(1, n + 1): if xx == 1: continue if xx == n and 1 not in XX: XX.append(1) continue XX.append(xx - 1) XX.append(xx + 1) while len(XX) != 0: x_ = XX.pop(0) if x_ <= 0 or x_ > n or visited[x_]: continue visited[x_] = True distance[x_] = distance[x] + 1 if x_ == m: x.append(distance[m]) break XX.append(x_) for i in xxx: print(x.popleft()) C++ BFS C++ 代码 tip:不能用queue,在数据量较大时会超时,所以这利用数组进行队列操作,很快。 #include using namespace std; const int N = 1000005; int n, m, h, t; int q[N]; bool st[N]; int dist[N]; int path[N]; int main() { int T; scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); // 对数组进行清零 memset(dist, 0, sizeof dist); memset(path, 0, sizeof path); memset(st, 0, sizeof st); h = 0, t = -1; q[++t] = 1; while (h <= t) { int x = q[h++]; for (int i = -1; i <= 1; i += 2) { int y = x + i; if (y > n) y = 1; if (y < 1) y = n; if (st[y] == false) { st[y] = true; if (dist[y] == 0 or dist[x] + 1 < dist[y]) { dist[y] = dist[x] + 1; path[y] = x;//y从x过来的 q[++t] = y;//让y入队 } } } } int ans = dist[m]; printf("%d\n", ans); } return 0; }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月13日
  • 已采纳回答 5月5日
  • 创建了问题 5月5日

悬赏问题

  • ¥15 本人本科机械,目前研一。没有深度学习基础,目前对研究生课题一片迷茫,请教各位!
  • ¥15 关于R语言单因素与多因素线性回归的平均值
  • ¥15 服务器清除BIOS之后引导不了
  • ¥15 CPLEX用OPL编写的混合整数线性优化问题。
  • ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
  • ¥15 前端预览docx文件,文件从后端传送过来。
  • ¥15 层次聚类和蛋白质相似度
  • ¥25 主成分分析中的第一第二主成分分别代表哪些参数
  • ¥15 oracle数据库查询语句问题
  • ¥15 有没有c++绘制算法的佬们吗救孩一下