HDU 4712 Hamming Distance(随机数法)




http://acm.hdu.edu.cn/showproblem.php?pid=4712







题目大意:

n个16进制数 任选两个异或  求异或结果二进制中1的最少个数

 



分析:

随机数法  没见过  







AC代码:

#include <bits/stdc++.h>
#define lowbit(x) (x&-x)
#define gcd(a,b) __gcd(a,b)
#define mset(a,x) memset(a,x,sizeof(a))
#define FIN     freopen("input","r",stdin)
#define FOUT    freopen("output","w",stdout)
const int INF=0x3f3f3f3f;
const double pi=acos(-1.0);
const double esp=1e-6;
const int MAX=1e5+10;
const int mod=1e9+7;
typedef long long ll;
using namespace std;
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
inline ll qpow(ll a,ll b){ll r=1,t=a; while(b){if(b&1)r=(r*t)%mod;b>>=1;t=(t*t)%mod;}return r;}
inline ll inv1(ll b){return qpow(b,mod-2);}
inline ll inv2(ll b){return b==1?1:(mod-mod/b)*inv2(mod%b)%mod;}
inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll r=exgcd(b,a%b,y,x);y-=(a/b)*x;return r;}
int dir[4][2]={0,1,1,0,0,-1,-1,0};
int a[1000005];
int judge(int x){
    int sum=0;
    while (x){
        if (x&1) sum++;
        x>>=1;
    }
    return sum;
}
int main (){
    int t;
    scanf ("%d",&t);
    while (t--){
        int n;
        scanf ("%d",&n);
        for (int i=0;i<n;i++) scanf ("%X",&a[i]);
        srand(time(0));
        int ans=INF;
        for (int i=0;i<1000005;i++){
            int index1=rand()%n;
            int index2=rand()%n;
            while (index1==index2) index2=rand()%n;
            ans=min(ans,judge(a[index1]^a[index2]));
        }
        printf ("%d\n",ans);
    }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/mm__1997/article/details/79235501