思路用个map存出线过的数然后用是1<<n的数去减,看这个数在mp里存不存在,注意如果和自身相等 需要看是不是出现次数大于1
1<<N 的n的范围要计算一波,起码是30才满足数据范围
#include<bits/stdc++.h>
using namespace std;
int a[120005];
int main(){
int n;
while(scanf("%d",&n)==1){
map<int,int>q;
int cnt=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
q[a[i]]++;
}
for(int i=0;i<n;i++){
int ok=0;
for(int p=0;p<=30;p++){
int t=(1<<p)-a[i];
if(q[t]){
if(t==a[i]&&q[t]==1){
continue;
}
ok=1;
break;
}
}
if(!ok)cnt++;
}
printf("%d\n",cnt);
}
return 0;
}
本文介绍了一种使用C++中的位运算结合标准模板库(map)解决特定算法问题的方法。通过遍历输入数据并利用位运算来检查是否能找到配对元素,实现了高效的解决方案。适用于需要快速查找配对或补数的场景。

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



