vijosP1471 教主的游乐场

vijosP1471 教主的游乐场

链接:https://vijos.org/p/1471

【思路】

   递推。

   首先找到最左边的可以一步跳到后方的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 }
原文地址:https://www.cnblogs.com/lidaxin/p/4904005.html