| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
HAWK,我这题没用堆栈,只用了一些变量,但我怎么算内存也没超过1000K,怎么回事啊……不用看程序,就看变量声明就够了……
#include<stdio.h>
#define MaxL 100
#define Max 1000
#define MaxNum(a,b) (a>b?a:b)
struct Number
{
int l;
char d[MaxL];
};
struct Number f[Max],g[Max],min[Max],put[Max];
int n,d[Max];
void copy(Number &a,Number b)
{ int i;
a.l=b.l;
for (i=0; i<a.l; i++) a.d[i]=b.d[i];
}
void add(Number &a,Number b)
{ int i;
short jin=0;
for (i=0; i<MaxNum(a.l,b.l); i++)
{if (i<a.l&&i<b.l) a.d[i]=a.d[i]+b.d[i]+jin;
else if (i>=a.l) a.d[i]=b.d[i]+jin;
else if (i>=b.l) a.d[i]=a.d[i]+jin;
jin=a.d[i]/10; a.d[i]%=10;
}
a.l=MaxNum(a.l,b.l);
while (jin>0)
{a.d[a.l]=jin; jin=a.d[a.l]/10; a.d[a.l]%=10; a.l++;}
}
void s_mul(Number a,short x,Number &c)
{ int i;
short jin=0;
c.l=a.l;
for (i=0; i<a.l; i++)
{c.d[i]=a.d[i]*x+jin;
jin=c.d[i]/10; c.d[i]%=10;
}
while (jin>0)
{c.d[c.l]=jin; jin=c.d[c.l]/10; c.d[c.l]%=10; c.l++;}
}
void adjust(Number &a)
{ int i;
short jin;
jin=-1; i=0;
do
{a.d[i]+=jin;
if (a.d[i]<0) {a.d[i]+=10; jin=-1;} else jin=0;
i++;
}
while (jin<0);
if (a.d[a.l-1]==0) a.l--;
}
void print(Number a)
{ int i;
for (i=a.l-1; i>=0; i--) printf("%d",a.d[i]);
printf("\n");
}
void init()
{ int i;
Number one;
scanf("%d",&n);
for (i=0; i<n; i++) scanf("%d",&d[i]);
one.l=1; one.d[0]=1;
f[0].l=1; f[0].d[0]=1;
for (i=1; i<n; i++)
{s_mul(f[i-1],2,f[i]);
add(f[i],one);
}
g[0].l=1; g[0].d[0]=1;
for (i=1; i<n; i++)
{g[i].l=0;
add(g[i],g[i-1]); add(g[i],f[i-1]); add(g[i],one);
}
}
int bigger(Number a,Number b)
{ int i;
if (a.l>b.l) return 1;
if (a.l<b.l) return 0;
for (i=a.l-1; i>=0; i--)
if (a.d[i]>b.d[i]) return 1;
return 0;
}
void search()
{ int i;
Number one,tmp;
one.l=1; one.d[0]=1;
min[0].l=1; min[0].d[0]=d[0];
put[0].l=1; if (d[0]) put[0].d[0]=0; else put[0].d[0]=1;
for (i=1; i<n; i++)
if (d[i])
{copy(put[i],min[i-1]);
if (i==1)
{if (d[i-1])
{min[i].l=1; min[i].d[0]=2;}
else
{copy(min[i],min[i-1]); add(min[i],g[i]);}
}
if (i>1)
{if (d[i-1])
{copy(min[i],min[i-1]); add(min[i],g[i]);
copy(tmp,min[i-2]); add(tmp,one); add(tmp,g[i-1]);
if (bigger(min[i],tmp)) copy(min[i],tmp);
}
else
{copy(min[i],min[i-1]); add(min[i],g[i]);
copy(tmp,put[i-1]); add(tmp,one); add(tmp,g[i-1]);
if (bigger(min[i],tmp)) copy(min[i],tmp);
}
}
}
else
{copy(put[i],put[i-1]); add(put[i],one); add(put[i],g[i-1]);
copy(min[i],min[i-1]);
}
}
int main()
{init();
search();
print(min[n-1]);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator