#include<stdio.h>
int main()
{
int len,a2=0,b2=0,a1=0,b1=0;
scanf("%d",&len);
int arr1[len],arr2[len];
for(int i=0;i<len;i++)
{
scanf("%d",&arr1[i]);
if(arr1[i]==1) a1=a1+1;
else b1=b1+1;
}
for(int i=0;i<len;i++)
{
scanf("%d",&arr2[i]);
if(arr2[i]==0)
{
if(arr1[i]==0)
{
a2=a2+1;
}
else b2=b2+1;
}
}
int sum;
sum=a2*a1+b2*b1-a2*b2;
printf("%d",sum);
}
本道题的解题思路呢很简单,其实在进行“or”运算之后,起决定性作用的是二进制序列里面的“1”。
按照题目要求,将两个序列摆好,发现,只要第二行的任意一个位置是“1”,那么进行“or”运算之后,结果肯定是“1”。所以问题的关键是第二行为“0”的位置有多少个,因为,这些位置是可以依据第一行的位置上的数字而改变的。
于是可以从第二行为零的位置和第一行对应位置的关系入手:
设第二行为“0”的位置上,对应的第一行也为“0”的数目为a2,第一行为“1”的数目为把把b2
第一行“1”的个数为a1,“0”的个数为b1
则情况总数为:sum=a1*a2(1和0调换)+b1*b2(0和1调换)- a2*b2(重复部分)
notes:本代码在本地dev可以运行,但是csdn的编译器就是 通过不了。如果是有问题,希望有小伙伴可以提示一下。