题目
Sample Input
32
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Sample Output
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
题意
给出一个sgn数组和va数组,vb数组,上图可知a与b如何得出a+b=c,c的值又是由下图得出,构造vc数组
思路
当va[i]+vb[i]=1时,vc[i]=1
当va[i]+vb[i]=2时,需要进位到 j ,因为需要考虑sgn[i]与进位的sgn[j]是否相同
1.如果相同,判断va[j]+vb[j]的值
如果va[j]+vb[j]=1,vc[j]仍然=1,再进到下一位即可
如果va[j]+vb[j]=2,进位,vc[j]=1
如果va[j]+vb[j]=0,进位,vc[j]=1,break
2.如果不相同
如果va[j]+vb[j]=1,vc[j]仍然=1,再进到下一位即可
如果va[j]+vb[j]=2,进位,vc[j]=1,break
如果va[j]+vb[j]=0,进位,vc[j]=1
j 的位置已经进位过了,下次循环从 j 的位置继续进位,降低时间复杂度
代码
#include<bits/stdc++.h>
using namespace std;
int sgn[110],va[110],vb[110],vc[100];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&sgn[i]);
for(int i=0;i<n;i++)
scanf("%d",&va[i]);
for(int i=0;i<n;i++)
scanf("%d",&vb[i]);
int i;
for(i=0;i<n;i++)
{
int x=va[i]+vb[i];
if(x==1)
vc[i]=1;
else if(x==2)
{
int j;
for(j=i+1;j<n;j++)
{
int y=va[j]+vb[j];
if(sgn[j]==sgn[i])
{
if(y==2)
vc[j]=1;
else if(y==0)
{
vc[j]=1;
break;
}
}
else
{
if(y==2)
{
vc[j]=1;
break;
}
else if(y==1)
break;
else if(y==0)
vc[j]=1;
}
}
i=j;
}
}
for(int i=0;i<n;i++)
{
if(!i)
printf("%d",vc[i]);
else
printf(" %d",vc[i]);
}
printf("\n");
return 0;
}