Codeforces Round #486 (Div. 3) D
阿新 • • 發佈:2018-12-24
題意:給你個數,要你找出最大的一個子集,每兩個數差的絕對值是2的指數冪。
題解:思維,在思維,排序,以第一個數a為基準,考慮一下與a的差為2的指數冪的數小於32個,再考慮一下這32個數中兩兩都要為2的指數冪時的最大個數時,似乎有點複雜,再想想,要等於2的冪,似乎只有|x-y|=2的時候能滿足,其實確實就是如此。然後能滿足的最多隻能是這樣的三個數
#include<bits/stdc++.h>
using namespace std;
int d[200005];
int s[40];
set <int> ans;
set<int> t;
set<int> a;
int main()
{
int n;
cin>>n;
for(int i=0;i<32;i++)
{
s[i]=((int)pow(2,i));
}
for(int i=0;i<n;i++)
{
cin>>d[i];
a.insert(d[i]);
}
sort(d,d+n);
for(int i=0;i<n;i++)
{
for (int j=0;j<31;j++)
{
t.insert(d[i]);
if(a.find(s[j]+d[i])!=a.end())
{
t.insert(d[i]+s[j]);
}
if(a.find(s[j+1]+d[i])!=a.end())
{
t.insert(d[i]+s[j+1]);
}
if(t.size()>ans.size())
{
ans=t;
}
t.clear();
}
}
cout <<ans.size()<<endl;
for(auto x:ans)
{
cout<<x<<' ';
}
return 0;
}