传送门
题意:
意思很明白,就是给你一堆数字给你。让你求出 ai&aj 的最大值。
题解:
提供两种方法,或者说是想法吧。
首先先排一下序。
- 第一种网上方法:ans只要加上某一位1匹配数>=2 不断更新O(31*n)
- 第二种自己方法:不断更新上限和下限不断压缩来找出答案。O(N log N-差不多吧)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a[1000500];
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
int ans=0;
for(int i=30;i>=0;i--){
int tmp=(1<<i),cnt=0;
for(int j=0;j<n;j++){
if( ((ans&a[j])==ans ) && ( (tmp&a[j]) ) ) {
cnt++;
}
}
if(cnt>=2){
ans=ans+tmp;
}
}
printf("%d\n",ans);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
typedef long long ll;
ll a[N];
ll cmp(ll a,ll b){
return a>b;
}
int main()
{
ll n;
scanf("%lld",&n);
for(int i=0;i<n;i++){
scanf("%lld",&a[i]);
}
sort(a,a+n,cmp);
ll len=0,t=a[0];
while(t){
t/=2;
len++;
}
ll ans=0;
ll D=0,U=n-1;
for(ll i=len;i>=0;i--){
ll tD=-1,tU=-1;
for(ll j=D;j<=U;j++){
if(a[j]&(1ll<<i)){
if(tD==-1){
tD=j;
}tU=j;
//printf("i: %d %d %d\n",i,tU,tD);
}
}
if(tD!=tU){
D=tD;
U=tU;
ans+=(1ll<<i);
}
}
printf("%lld\n",ans);
return 0;
}