//本题实际上是一个小贪心
//无非就是当来到某一个位置时怎么选择接下来的跳法是最优的这么一个问题
//有以下几种可能
//1.能跳多远跳多远;这种无脑跳法肯定是错的,题目示例就过不去
//2.跳到可以跳的范围内最大的那个数上,这种跳法看似可以其实也不对比如:3 3 2 1 1 4,如果按这种跳法就不对
//对于3 3 2 1 1 4如果按照2的方法首先会跳到第二个3上然后跳到2上然后跳到第二个1上最后跳到4上答案为4然而正确答案为3
//最正确的跳法是:如果本次直接可以跳到最后那就不扯那么多直接跳最后就完事了
//如果不能则在可以跳的范围里选择跳的距离和跳到的位置上值相加起来值最大的,如果有相等的则选择最远的
//还是拿3 3 2 1 1 4来说,第一次跳时可以选择跳3 2 1,对应的和为1+3=4,2+2=4,3+1=4,三个和都一样选择最后的位置所以跳到1上
//来到1时只能跳1,然后再跳4所以答案为3
//下面就是用这种贪心策略的代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int*p=new int[n];
for(int i=0;i<n;i++)
cin>>p[i];
int res=0;//记录最少要跳多少步
int index=0;//起始位置
while(index!=n-1){//没跳到最后一个位置之前
res++;//跳一步
if(index+p[index]>=n-1)
break;//如果在当前位置可以一步跳到最后一个位置则直接跳
else{//否则要跳到值最大且更靠后的位置上
int max=-1;
int ans=0;//记录这个位置在哪
for(int i=1;i<=p[index];i++){
if(p[index+i]+i>=max){
max=p[index+i]+i;
ans=i;
}
}
index=index+ans;//index移动到下一个位置上
}
}
cout<<res<<endl;
return 0;
}
//无非就是当来到某一个位置时怎么选择接下来的跳法是最优的这么一个问题
//有以下几种可能
//1.能跳多远跳多远;这种无脑跳法肯定是错的,题目示例就过不去
//2.跳到可以跳的范围内最大的那个数上,这种跳法看似可以其实也不对比如:3 3 2 1 1 4,如果按这种跳法就不对
//对于3 3 2 1 1 4如果按照2的方法首先会跳到第二个3上然后跳到2上然后跳到第二个1上最后跳到4上答案为4然而正确答案为3
//最正确的跳法是:如果本次直接可以跳到最后那就不扯那么多直接跳最后就完事了
//如果不能则在可以跳的范围里选择跳的距离和跳到的位置上值相加起来值最大的,如果有相等的则选择最远的
//还是拿3 3 2 1 1 4来说,第一次跳时可以选择跳3 2 1,对应的和为1+3=4,2+2=4,3+1=4,三个和都一样选择最后的位置所以跳到1上
//来到1时只能跳1,然后再跳4所以答案为3
//下面就是用这种贪心策略的代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int*p=new int[n];
for(int i=0;i<n;i++)
cin>>p[i];
int res=0;//记录最少要跳多少步
int index=0;//起始位置
while(index!=n-1){//没跳到最后一个位置之前
res++;//跳一步
if(index+p[index]>=n-1)
break;//如果在当前位置可以一步跳到最后一个位置则直接跳
else{//否则要跳到值最大且更靠后的位置上
int max=-1;
int ans=0;//记录这个位置在哪
for(int i=1;i<=p[index];i++){
if(p[index+i]+i>=max){
max=p[index+i]+i;
ans=i;
}
}
index=index+ans;//index移动到下一个位置上
}
}
cout<<res<<endl;
return 0;
}