vijosP1471 教主的游乐场
【思路】
递推。
首先找到最左边的可以一步跳到后方的L,
那么L之后的点有两种情况:要么a足以跳到后方步数为1,要么可以一步调到L有L跳到后方步数为2。
对于L之前的点而言,再进行相同的操作,相当于代码中缩小R为L。
【代码】
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 const int maxn = 100000+10; 6 7 int n,q; 8 int a[maxn],step[maxn]; 9 10 inline int read_int(){ 11 char c=getchar(); 12 while(!isdigit(c)) c=getchar(); 13 int x=0; 14 while(isdigit(c)) { 15 x=x*10+c-'0'; 16 c=getchar(); 17 } 18 return x; 19 } 20 21 int main() { 22 ios::sync_with_stdio(false); 23 n=read_int(); q=read_int(); 24 for(int i=1;i<=n;i++) a[i]=read_int(); 25 26 int L=1,R=n+1; 27 step[R]=0; 28 do{ 29 int i=1; 30 while(i+a[i]<R) i++; 31 for(int j=i;j<R;j++) 32 if(j+a[j]>=R) step[j]=step[R]+1; 33 else step[j]=step[R]+2; 34 R=i; 35 }while(R>1); 36 int x; 37 for(int i=1;i<=q;i++) { 38 x=read_int(); 39 cout<<step[x]; 40 if(i<q) cout<<" "; 41 else 42 cout<<" "; 43 } 44 return 0; 45 }