题目

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;
}
数组运算与进位处理
该博客主要讨论了一种数组运算的问题,其中涉及到sgn、va、vb三个数组的结合,通过运算得到vc数组。当va[i]+vb[i]等于1时,vc[i]设置为1;若等于2,则需要考虑进位,根据sgn[i]和后续位的sgn[j]判断是否进位及vc[j]的值。代码中展示了具体的进位逻辑,从而构造出正确的vc数组。
558

被折叠的 条评论
为什么被折叠?



