有点贪心的思想 最后一个数据过不去

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
typedef long long ll;
ll lb(ll x){
    return x&(-x);
}
int cnt;
struct ac{
   ll v,lb,id;
}a[maxn];
bool all(){
    for(int i=2;i<=cnt;++i){
        if(a[i].lb!=a[i-1].lb) return false;
    }
    return true;
}
map<int,bool> mmp;
int main(){
    int n;
    cin>>n;
    int v,cnt0=0;
    cnt=0;
    for(int i=1;i<=n;++i){
        cin>>v;
        if(v==0) {
            cnt0++;
            continue;
        }
        if(mmp[v]==0){
            a[++cnt].v=v;
            a[cnt].lb=lb(a[cnt].v);
            mmp[v]=1;
        }
    }
    if((cnt0==0&&cnt==1)||(cnt0==n)){ //全部一样(或全为0)
        cout<<0<<"\n";
        return 0;
    }
    if(cnt==1&&cnt0!=1){//除0外全部一样,但有0
        int f;
        for(int i=1;i<=cnt;++i){
            if(a[i].v!=0){
                f=a[i].lb;
                break;
            }
        }
        long long t=1;
        for(int i=1;i<=f-1;++i){
            t*=2;
        }
        cout<<t<<"\n";
        return 0;
    }
    ll s=0;
    if(all()&&cnt0!=0){//lb全一样且有0
        int f;
        for(int i=1;i<=cnt;++i){
            if(a[i].v!=0){
                f=a[i].lb;
                break;
            }
        }
        cout<<cnt*f<<"\n";
        return 0;
    }
    while(all()&&cnt0==0){
        s++;
        for(int i=1;i<=cnt;++i){
            a[i].v/=2;
            a[i].lb=lb(a[i].v);
        }
    }
    ll Min=20000000000;
    for(int i=1;i<=cnt;++i){
        Min=min(Min,a[i].lb);
    }
    for(int i=1;i<=s;++i){
        Min*=2;
    }
    cout<<Min*(cnt+(cnt0==0?0:1)-1)<<"\n";
    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务