题目链接:题目详情 (pintia.cn)
分析:我们可以先按位相加,然后再从前往后进行纠正每一位使得每一位的二进制值都是0或者1,比如当前位是3,我们需要对他减2,如果下一位与当前符号位相同,那么当前位减2就需要后一位加1,如果下一位与当前符号位相反,那么当前符号位减2,就需要后一位减1,如果当前位小于0,需要加2,那么类似地进行讨论就行了,我就不赘述了,下面上代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int N=110;
int a[N],b[N],c[N],ans[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&c[i]);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
ans[i]=a[i]+b[i];
}
for(int i=1;i<n;i++)
{
if(ans[i]>=2)
{
if(c[i]==c[i+1])//若相邻两位正负号相同,则前一位减2后一位应加1
{
ans[i+1]+=ans[i]/2;
ans[i]%=2;
}
else//若相邻两位正负号相反,则前一位减2后一位应减1
{
ans[i+1]-=ans[i]/2;
ans[i]%=2;
}
}
else if(ans[i]<0)
{
if(c[i]==c[i+1])//若相邻两位正负号相同,则前一位加2后一位应减1
{
ans[i+1]-=(abs(ans[i])-1)/2+1;
ans[i]=(ans[i]%2+2)%2;
}
else//若相邻两位正负号相反,则前一位加2后一位应加1
{
ans[i+1]+=(abs(ans[i])-1)/2+1;
ans[i]=(ans[i]%2+2)%2;
}
}
}
printf("%d",ans[1]);
for(int i=2;i<=n;i++)
printf(" %d",ans[i]);
return 0;
}