#6为什么TLE!!!
查看原帖
#6为什么TLE!!!
284715
遮云壑楼主2020/10/29 22:04

对于每一个位置,枚举跳上来的高度,通过枚举指数K来实现,然后状态转移

#include<bits/stdc++.h>
#define maxn 210
using namespace std;

inline void read(int &x)
{
	int y=1;
	x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
	   if(ch=='-')y=-1;
	   ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
	   x=x*10+ch-'0';
	   ch=getchar();
	}
	x=x*y;
}

int n;
int h[maxn];
int opt[maxn];

int main()
{
	read(n);
	for(int i=1;i<=n;i++)read(h[i]);
	memset(opt,0x3f,sizeof(opt));
	opt[1]=0;
	for(int i=2;i<=n;i++)
	{		
		int nh=h[i],jump=1,j=i-1;
		for(int k=0;nh-jump/2>=0;k++,jump*=2)
		{
			for(;j-k>0;--j)
			{
				if(h[j-k]+jump<nh)break;
				opt[i]=min(opt[i],opt[j]+k+1);
			}
		}
		opt[i-1]=min(opt[i-1],opt[i]+1);
	}
	if(opt[n]==0x3f3f3f3f)printf("-1\n");
	else printf("%d\n",opt[n]);
	return 0;
}
2020/10/29 22:04
加载中...