标签:des style blog http io color ar os sp
【Shadow 1】第二题
Shadow最近知道了图灵机是什么(Shadow:就是一行格子和一个机器头移来移去的呗!),于是他突发奇想,创造了一个新游戏——“图灵机游戏”(Shadow:好听吧?)。
游戏规则如下:
在一条长长的纸上有N个格子,每个格子上都有一个数,第i格的数记为Ai,机器头刚开始在第1格。这个游戏有两个操作:
1.如果现在在第i格,则可以移动机器头到第Ai格;
2.把某个Ai减少或增加1。
然而,fotile96看了之后却不以为然。“嗯,你挑战一下用最少次数使机器头到达第N格吧,这样好玩些……”
现在,Shadow已经快Crazy了。于是,Shadow把脸转向了你……
思路:进行广搜最短路,每次有三种状态:进行已知的位移,位置加一或减一。比较简单的广搜,但是一开始无奈的写错了程序,理解错了题意,1这个点第一次只能到a
[1]的位置,不能+1或-1,一开始就是因为没有理解好题,写出了tle一个点的东西。。。(可能是我的思路和实现的不一样。。。),然后就a了。。。
用一个数组标记这个点是否入队,只标记,不置反。这样能保证一个点的ans最优,同时避免了循环对列。
95分:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int que[5000001][3]={0},a[100001]={0},n,ll,ci[100001]={0}; void bfs() { int head,tail,tt,i; head=0;tail=1; que[1][0]=1; que[1][1]=a[1]; que[1][2]=0; ci[1]=0; while (head!=tail) { head=head%ll+1; if (que[head][0]!=que[head][1]) { tt=tail%ll+1; if (que[head][2]+1<ci[que[head][1]]) { ci[que[head][1]]=que[head][2]+1; tail=tail%ll+1; que[tail][0]=que[head][1]; que[tail][1]=a[que[tail][0]]; que[tail][2]=que[head][2]+1; } if (que[tail][0]==n) break; } if (que[head][1]<n&&que[head][2]+2<ci[que[head][1]+1]) { ci[que[head][1]]=que[head][2]+2; tail=tail%ll+1; que[tail][0]=que[head][0]; que[tail][1]=que[head][1]+1; que[tail][2]=que[head][2]+1; } if (que[head][1]>1&&que[head][2]+2<ci[que[head][1]-1]) { ci[que[head][1]]=que[head][2]+2; tail=tail%ll+1; que[tail][0]=que[head][0]; que[tail][1]=que[head][1]-1; que[tail][2]=que[head][2]+1; } } } int main() { int i,j; memset(ci,127,sizeof(ci)); ll=5000000; scanf("%d",&n); for (i=1;i<=n;++i) scanf("%d",&a[i]); bfs(); printf("%d\n",ci[n]); }
100分:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int que[1000001]={0},a[100001]={0},n,ll,ci[100001]={0}; bool use[100001]={false}; void bfs() { int head,tail,i; head=tail=1; que[1]=a[1]; ci[a[1]]=1; use[a[1]]=true; while (head<=tail) { if (que[head]==n) break; if (!use[a[que[head]]]) { tail=tail+1; que[tail]=a[que[head]]; ci[que[tail]]=ci[que[head]]+1; use[que[tail]]=true; } if (que[head]<n&&!use[que[head]+1]) { tail=tail+1; que[tail]=que[head]+1; ci[que[tail]]=ci[que[head]]+1; use[que[tail]]=true; } if (que[head]>1&&!use[que[head]-1]) { tail=tail+1; que[tail]=que[head]-1; ci[que[tail]]=ci[que[head]]+1; use[que[tail]]=true; } ++head; } } int main() { int i,j; scanf("%d",&n); for (i=1;i<=n;++i) scanf("%d",&a[i]); bfs(); if (n==1) printf("0\n"); else printf("%d\n",ci[n]); }
标签:des style blog http io color ar os sp
原文地址:http://www.cnblogs.com/Rivendell/p/4095849.html