记录编号 22211 评测结果 AAAAAAAAAA
题目名称 拯救 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 0.065 s
提交时间 2010-11-17 17:50:32 内存使用 6.42 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=1005;

typedef long long LL;

struct High
{
	int len,a[400];
	High(){reset();}
	void reset(){memset(a,0,sizeof(a));len=1;}
};

High operator + (High a,const int &num)
{
	if (num==1)
	{
		a.a[0]+=1;
		int i;
		for(i=0;a.a[i]>=10;i++)
		{
			a.a[i+1]+=1;
			a.a[i]-=10;
		}
		if (a.a[i]&&i+1>a.len)
			a.len=i+1;
	}
	else printf("wrong!\n");
	return a;
}

High operator + (const High &a,const High &b)
{	
	High ans;
	ans.len=max(a.len,b.len);
	for(int i=0;i<ans.len;i++)
	{
		ans.a[i]+=a.a[i]+b.a[i];
		ans.a[i+1]=ans.a[i]/10;
		ans.a[i]%=10;
	}
	if (ans.a[ans.len])
		ans.len++;
	return ans;
}

int a[MAXN];
int N;
High d[MAXN][2],g[MAXN],f[MAXN];

void print(const High a)
{
	for(int i=a.len-1;i>=0;i--)
		printf("%d",a.a[i]);
	printf("\n");
}

void print(const LL a)
{
	printf("%lld\n",a);
}

int main()
{
	freopen("savey.in","r",stdin);
	freopen("savey.out","w",stdout);
	scanf("%d",&N);
	for(int i=1;i<=N;i++)
		scanf("%d",a+i);
	for(int i=1;i<=N;i++)
	{
		g[i]=g[i-1]+1+g[i-1];
//		print(g[i]);
	}
	if (a[1]) d[1][0].a[0]=1;
	else d[1][1].a[0]=1;
//	if (a[1]) d[1][0]=1;
//	else d[1][1]=1;
	for(int i=1;i<=N;i++)
	{
		if (a[i])
			d[i][0]=d[i-1][1]+1+g[i-1],
			d[i][1]=d[i-1][0];
		else 
			d[i][0]=d[i-1][0],
			d[i][1]=d[i-1][1]+1+g[i-1];
	}
	print(d[N][0]);
//	printf("%lld\n",d[N][0]);
	return 0;
}