庭师的利刃(暴力)

传送门

题意:

意思很明白,就是给你一堆数字给你。让你求出  ai&aj 的最大值。

题解:

提供两种方法,或者说是想法吧。

首先先排一下序。

  1. 第一种网上方法:ans只要加上某一位1匹配数>=2    不断更新O(31*n)
  2. 第二种自己方法:不断更新上限和下限不断压缩来找出答案。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;
}

猜你喜欢

转载自blog.csdn.net/Z_sea/article/details/81257759