1. 程式人生 > >Codeforces Round #486 (Div. 3) D

Codeforces Round #486 (Div. 3) D

傳送

題意:給你2105個數,要你找出最大的一個子集,每兩個數差的絕對值是2的指數冪。

題解:思維,在思維,排序,以第一個數a為基準,考慮一下與a的差為2的指數冪的數小於32個,再考慮一下這32個數中兩兩都要為2的指數冪時的最大個數時,似乎有點複雜,再想想,|2x2y|要等於2的冪,似乎只有|x-y|=2的時候能滿足,其實確實就是如此。然後能滿足的最多隻能是aa+2xa+2x+1這樣的三個數

#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; }