Points and Powers of Two

題目鏈接:http://codeforces.com/contest/988/problem/D
意思:從一堆數(shù)中選一個(gè)最大子集,使得任意兩個(gè)數(shù)相減的絕對(duì)值都是2的冪。
思考:首先很難的一點(diǎn),需要想到子集最多只能有三個(gè),四個(gè)及以上的子集一定不存在(可以下去證明一下),有了這一條,我們可以考慮從三個(gè)的開始搜索,用set集合儲(chǔ)存并對(duì)齊進(jìn)行遍歷。當(dāng)有三個(gè)元素時(shí),則必有其中兩對(duì)元素之差相等(自行證明),那么可以對(duì)set中元素加上2的某次冪,減去2的某次冪,然后判斷是否再set中,是的話即可輸出。 對(duì)于兩個(gè)元素和一個(gè)元素類比。(注意如果集合中只有一個(gè)元素不管是否為2的冪都要輸出。)

注意:<<位運(yùn)算優(yōu)先級(jí)比+低,需要打括號(hào)。

代碼:
#include<iostream>
#include<set>
using namespace std;

set<long long int> a;

int main(){
long long int n;
cin>>n;
long long int now;
while(n--){
cin>>now;
a.insert(now);
}
if(a.size()==1){
for(int i:a){
cout<<"1\n"<<i<<endl;
}
}
else{
int judge = 1;//判斷是否已經(jīng)存在解

for(long long int i:a){
    if(!judge)break;
for(int j=0;j<32;j++){
    if(a.count(i-(1LL<<j))&&a.count(i+(1LL<<j))){
    cout<<"3\n"<<i<<" "<<(i+(1LL<<j))<<" "<<(i-(1LL<<j))<<endl;//i-2的冪,i,i+2的冪 都要在set內(nèi)即有解
    judge = 0;
    break;
    }
}
}

if(judge){
for(long long int i:a){
if(!judge)break;
for(int j=0;j<32;j++){
if(a.count(i+(1LL<<j))){
cout<<"2\n"<<i<<" "<<(i+(1LL<<j))<<endl;
judge = 0;
break;
}
}
}
}
if(judge){
for(int i:a){
if(!judge)break;
for(int j=0;j<32;j++){
if(i==(1LL<<j)){
cout<<"1\n"<<i<<endl;
judge = 0;
break;
}
}
}
}
}
return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容