思路:
DP,设f[i]为运人所花费的时间,然后三个for分别枚举当前层、从那层出发,跳到下一层,最后判断能否跳到。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n;
long long a[1000],f[1000];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(f,0x7f,sizeof(f));//初始化
f[1]=0;//初始化
for(int i=2;i<=n;i++)//三个for枚举
for(int j=i-1;j>=1;j--)
for(long long l=1,k=0;k<j;k++,l*=2)
if(a[j-k]+l>=a[i])//能否跳到
f[i]=min(f[i],f[j]+k+1);//转移
if(f[n]!=f[0])
printf("%lld",f[n]);//输出
else printf("-1");//否则登不上