YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目大意:n个数,任意整数x对这n个数取异或值,然后使最大值最小。

思路:数据范围最大为pow(2,30);所以考虑二进制的话,最多有30位。对于某一位d,然后考虑数组v中每一个元素的d为是0还是1,将为0的元素放到数组v0中,将为1的元素放到数组v1中。如果v0中的元素个数为0,那么说明这一位置上的元素全为1,所以我们贪心地希望x在该位置上的为1,对于V1同理.如果说v1和v0都不等于0,那么说明x在该位置与其他元素做异或运算,肯定会有1,所以答案为为两种情况的最小值+1<<d.

ACcode:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1E5+7;
ll arr[N];
vector<ll >ve;
ll dfs(ll d,vector<ll >v){
    if(d<0||v.size()==0) return 0;
    vector<ll >v1,v0;
    for(ll i=0;i<v.size();i++){
        if((v[i]>>d)&1){
            v1.push_back(v[i]);
        }
        else v0.push_back(v[i]);
    }
    if(v1.size()==0) return dfs(d-1,v0);
    else if(v0.size()==0) return dfs(d-1,v1);
    else    return min(dfs(d-1,v0),dfs(d-1,v1))+(1<<d);
}
int main(){
    ll n;
    cin>>n;
    for(ll i=1;i<=n;i++){
        cin>>arr[i];
        ve.push_back(arr[i]);
    }
    cout<<dfs(30,ve)<<endl;
    return 0;
}
posted on 2020-01-19 14:16  Target--fly  阅读(194)  评论(0编辑  收藏  举报