从最高位开始向低位遍历:
如果存在大于1个数有这个最高位,那么答案一定在这堆数中(因为低位就算全是1也比不过高位);
如果小于等于1个数有这个最高位,那么可以忽略这次遍历,因为和谁与一下都成0了,没啥用
#include<bits/stdc++.h>
using namespace std;
int n,a[1000006];
vector<int>v,vv;//存下标
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i],v.push_back(i);
for(int bit=(1<<30);bit>=1;bit>>=1){
for(int i=0;i<v.size();i++)if((a[v[i]]&bit))vv.push_back(v[i]);//vv充当一个暂存的作用
if(vv.size()>=2)v=vv;
vv.clear();
}
cout<<v[0]<<' '<<v[1]<<'\n';
return 0;
}
}

京公网安备 11010502036488号