牛牛的跳跳棋



解题思路
这道题看起来是一道大暴力,实际上呢它只是一道贪心。这样想,如果我们从一个点出发,走到它取值范围的最右边(往左走是没有意义的),当我们怎么也走不下去的时候,我们就可以使用魔法了。
code
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,p[100010];
long long maxn=1,maxx=1;
long long ans,a[100010];
void output()
{
cout<<ans<<endl;
for(int i=1;i<=ans;i++)
cout<<a[i]<<" ";
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%lld",&p[i]);
for(int i=1;i<=n;i++)
{
if(i+p[i]>maxn&&p[i])
{
maxn=i+p[i];
maxx=i;
if(maxn>n)
{
output();
return 0;
}
}
else if(i==maxn)
{
ans++;
a[ans]=maxx;
maxn++;
maxx=maxn;
if(maxn>n)
{
output();
return 0;
}
}
}
}
7万+





