我这代码好像有问题。。。。
居然AC了。。。。。。。
就是反转的时候,如果一开始第一个就是1,我们有2种反转方式,反转第一个它本身,或者反转第2个。。。
这2个代码的init就是考虑这种情况来写的。。。。不过第一种好像有问题。。。。。。。
#include<stdio.h>
#define INF 0x3f3f3f3f
#define min(x,y) ((x>y)?(y):(x))
int C[22];
int cal(int init)
{
int f[25],res=0,i;
memset(f,0,sizeof(f));
f[0]=init;
for(i=0;i<20;i++)
{
if((f[i]+C[i])&1)
{
res++;
f[i]+=1;
f[i+1]+=1;
f[i+2]+=1;
}
}
if((C[20]+f[20])&1)
return INF;
else
return res;
}
int main(void)
{
int i;
for(i=1;i<=20;i++)
scanf("%d",&C[i]);
printf("%d\n",min(cal(0),cal(1)));
}
#include<stdio.h>
#define INF 0x3f3f3f3f
#define min(x,y) ((x>y)?(y):(x))
int C[22];
int cal(int init)
{
int f[25],res=0,i,sum=0;
memset(f,0,sizeof(f));
C[0]=init;
for(i=0;i<20;i++)
{
if((sum+C[i])&1)
{
res++;
f[i]+=1;
}
sum+=f[i];
if(i-2>=0)
sum-=f[i-2];
}
if((C[20]+sum)&1)
return INF;
else
return res;
}
int main(void)
{
int i;
for(i=1;i<=20;i++)
scanf("%d",&C[i]);
printf("%d\n",min(cal(0),cal(1)));
}