比赛 20121030 评测结果 AAAAAAAAAA
题目名称 迷之阶梯 最终得分 100
用户昵称 Makazeu 运行时间 0.064 s
代码语言 C++ 内存使用 3.28 MiB
提交时间 2012-10-30 21:54:09
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
typedef unsigned int usint;
const usint MAXN=222;
usint INF,ichi=1;
usint F[MAXN],N,H[MAXN],bny[MAXN]={1};
queue<usint> q;

inline void init()
{
	cin>>N;
	if(N==ichi) {printf("0\n");exit(0);}
	for(usint i=1;i<=N;i++) cin>>H[i];
	for(usint i=1;i<=31;i++) bny[i]=bny[i-1]*2;
	INF=bny[31];
	for(usint i=32;i<=N;i++) bny[i]=INF+1;
	for(usint i=1;i<=N;i++) F[i]=INF;
	F[1]=0;	q.push(ichi);
}

inline void bfs()
{
	usint now,k;
	while(q.size())
	{
		now=q.front(); q.pop();
		if(now<N && H[now+1]==H[now]+1 && F[now]+1<F[now+1])
		{
			F[now+1]=F[now]+1;
			q.push(now+1);
		}
		if(now==ichi) continue;
		for(usint i=now-1;i>=1;i--)
		{
			for(usint j=i+1;j<=N;j++)
			{
				if(H[i]+bny[now-i]<H[j]) break;
				k=F[now]+now-i+1;
				if(k>=F[j]) continue;
				F[j]=k; q.push(j);
			}
		}
	}
}

int main()
{
	freopen("ladder.in","r",stdin);
	freopen("ladder.out","w",stdout);
	init(); bfs();
	if(F[N]==INF) cout<<-1<<endl;
	else cout<<F[N]<<endl;
	return 0;
}