题意
n个数字,问最少删除多少个数字可以使得每个数字a[i]都能找到一个数字a[j](i != j)a[i]+a[j]为2次方?
题解
因为1e9以内2的次方共有30多个,我们可以枚举每一个数字a[i],然后再枚举2的次幂j,然后查找数组中有没有 j-a[i] 这个值且不是a[i]本身,如果没有这个数字就要删去。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 120005;
const int INF = 0x3f3f3f3f;
typedef long long LL;
int n, a[35];
map<int, int> mp;
int main()
{
for (int i = 0; i <= 30; i++) a[i] = 1<<i;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
int t; scanf("%d", &t);
mp[t]++;
}
int ans = 0;
for (auto i: mp)
{
int t = i.first;
bool flag = false;
for (int j = 0; j <= 30; j++)
{
if (a[j]-t == t)//不能是a[i]本身
{
if (mp.count(t) && mp[t] > 1) { flag = true; break; }
}
else if (mp.count(a[j]-t)) { flag = true; break; }
}
if (!flag) ans += i.second;
}
printf("%d\n", ans);
return 0;
}
/*
6
4 7 1 5 4 9
*/