【codevs 2292】图灵机游戏
2016-09-29 08:52
239 查看
2292 图灵机游戏
时间限制: 1 s
空间限制: 64000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
【Shadow 1】第二题
Shadow最近知道了图灵机是什么(Shadow:就是一行格子和一个机器头移来移去的呗!),于是他突发奇想,创造了一个新游戏——“图灵机游戏”(Shadow:好听吧?)。
游戏规则如下:
在一条长长的纸上有N个格子,每个格子上都有一个数,第i格的数记为Ai,机器头刚开始在第1格。这个游戏有两个操作:
1.如果现在在第i格,则可以移动机器头到第Ai格;
2.把某个Ai减少或增加1。
然而,fotile96看了之后却不以为然。“嗯,你挑战一下用最少次数使机器头到达第N格吧,这样好玩些……”
现在,Shadow已经快Crazy了。于是,Shadow把脸转向了你……
输入描述 Input Description
第1行,1个整数N;
第2行,N个整数Ai。
输出描述 Output Description
1行,1个整数,为最少的操作次数。
样例输入 Sample Input
5
3 4 2 5 3
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
对于30%的数据,1≤N≤10;
对于60%的数据,1≤N≤1000;
对于100%的数据,1≤N≤100000,1≤Ai≤N。
2.跳到第4格
3.跳到第5格,结束游戏
边权是1 那么bfs就可以解决
每次+1或者-1可以看成 加边
建图最短路也可以
要注意的就是只有1个点的情况
从本身到本身 是不需要操作的
时间限制: 1 s
空间限制: 64000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
【Shadow 1】第二题
Shadow最近知道了图灵机是什么(Shadow:就是一行格子和一个机器头移来移去的呗!),于是他突发奇想,创造了一个新游戏——“图灵机游戏”(Shadow:好听吧?)。
游戏规则如下:
在一条长长的纸上有N个格子,每个格子上都有一个数,第i格的数记为Ai,机器头刚开始在第1格。这个游戏有两个操作:
1.如果现在在第i格,则可以移动机器头到第Ai格;
2.把某个Ai减少或增加1。
然而,fotile96看了之后却不以为然。“嗯,你挑战一下用最少次数使机器头到达第N格吧,这样好玩些……”
现在,Shadow已经快Crazy了。于是,Shadow把脸转向了你……
输入描述 Input Description
第1行,1个整数N;
第2行,N个整数Ai。
输出描述 Output Description
1行,1个整数,为最少的操作次数。
样例输入 Sample Input
5
3 4 2 5 3
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
对于30%的数据,1≤N≤10;
对于60%的数据,1≤N≤1000;
对于100%的数据,1≤N≤100000,1≤Ai≤N。
样例解释
1.先将第1格的值加12.跳到第4格
3.跳到第5格,结束游戏
边权是1 那么bfs就可以解决
每次+1或者-1可以看成 加边
建图最短路也可以
要注意的就是只有1个点的情况
从本身到本身 是不需要操作的
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> using namespace std; const int MAXN = 500000 + 5; int to[MAXN]; int deep[MAXN]; bool use[MAXN]; queue<int>q; int n; void spfa(int s) { deep[s] = 1; use[s] = true; while(!q.empty()) q.pop(); q.push(s); while(!q.empty()) { int u = q.front(); q.pop(); if(!use[to[u]]) { q.push(to[u]); use[to[u]] = true; deep[to[u]] = deep[u] + 1; } if(!use[u + 1] && u + 1 <= n) { q.push(u + 1); use[u + 1] = true; deep[u + 1] = deep[u] + 1; } if(!use[u - 1] && u - 1 >= 1) { q.push(u - 1); use[u - 1] = true; deep[u - 1] = deep[u] + 1; } } return; } int tmp; int main() { scanf("%d",&n); if(n == 1) { puts("0"); return 0; } for(int i = 1; i <= n; i ++) scanf("%d",&to[i]); spfa(to[1]); printf("%d\n",deep ); return 0; }
相关文章推荐
- 【codevs】2292图灵机游戏
- AC日记——图灵机游戏 codevs 2292
- codevs 2292 图灵机游戏
- codevs2292 图灵机游戏
- CODE[VS] 2292 图灵机游戏 SPFA求最短路
- Codevs 2292 图灵机游戏 解题报告
- 【codevs2292】图灵机游戏
- 2292 图灵机游戏
- codevs 2292 图灵机游戏(BFS)
- 2292 图灵机游戏
- codevs1166 矩阵取数游戏(区间DP)
- codevs 1269 匈牙利游戏 SPFA+次短路
- codevs 1052 地鼠游戏 题解报告
- [codevs]1269匈牙利游戏
- 【codevs 1085】数字游戏
- [codevs 1051]接龙游戏(栈)
- codevs 1198 国王游戏
- 【codevs 1269】匈牙利游戏
- codevs 1085 数字游戏
- 【CodeVS】1229 数字游戏 开放性 搜索 Hash