).
For example, the following sequences are good:
- [5,3,11]
- .
Note that, by definition, an empty sequence (with a length of 0
) is good.
For example, the following sequences are not good:
- [16]
- such that their sum is a power of two).
You are given a sequence a1,a2,…,an
. What is the minimum number of elements you need to remove to make it good? You can delete an arbitrary set of elements.
The first line contains the integer n
) — the length of the given sequence.
The second line contains the sequence of integers a1,a2,…,an
( 1≤ai≤109).
Print the minimum number of elements needed to be removed from the given sequence in order to make it good. It is possible that you need to delete all n
elements, make it empty, and thus get a good sequence.
6 4 7 1 5 4 9
1
5 1 2 3 4 5
2
1 16
1
4 1 1 1 1023
0
In the first example, it is enough to delete one element a4=5
. The remaining elements form the sequence [4,7,1,4,9], which is good.
题意:求至少删掉所给集合中的几个元素,使得集合内的任意一个元素x均能在剩余元素中找到一个元素y,使x+y为2的幂次方
思路:可以枚举所有2的幂次方,对每一个元素判断
代码:
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int N = 120005;
map<int,int>mp;
int arr[N];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
mp[arr[i]]++;
}
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<=31;j++){
int x=(1<<j)-arr[i];
if(mp[x]&&(mp[x]>1||mp[x]==1&&x!=arr[i])){//判断x是否在集合内
ans++;
break;
}
}
}
printf("%d\n",n-ans);
return 0;
}