题目链接:http://codeforces.com/problemset/problem/988/D
给出n个数求最大子集使得子集中两两之差为2的整数幂。
分析一下可以知道子集最多有三个数并且成等差数列,只需对每个ai看ai+2^j和ai+2^j+2^j是否在集合中。纯暴力枚举会超时,可以用set的count函数或者二分查找,注意要用long long。
#include<stdio.h>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{
int n,t,ans=1;
set<ll>a;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%I64d",&t);
a.insert(t);
}
for(set<ll>::iterator it=a.begin();it!=a.end();++it)
{
for(ll i=1;i<2e9;i*=2)
{
//printf("%d\n",i);
if(a.count(*it+i)&&a.count(*it+i+i))
{
printf("3\n");
//printf("%d\n",i);
printf("%I64d %I64d %I64d",*it,*it+i,*it+i+i);
return 0;
}
}
}
for(set<ll>::iterator it=a.begin();it!=a.end();++it)
{
for(ll i=1;i<2e9;i*=2)
{
if(a.count(*it+i))
{
printf("2\n");
printf("%I64d %I64d",*it,*it+i);
return 0;
}
}
}
printf("1\n%I64d",*a.begin());
return 0;
}