您的位置:首页 > 其它

vijosP1471 教主的游乐场

2016-03-30 17:27 253 查看
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<<"\n";
43     }
44     return 0;
45 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: