ZOJ 拿成都区域赛的题作为一次比赛了,我就做了这个,水题。。。
本来没想做的,轻工的一个学长说,看看题型。。。结果我就看了这道水题,纠结了半天,A了后果断图书馆了。
比较两数的二进制差异,找出最小差异。
没看清题目,如果差异相同,输出最小的那个A中的数。我晕,WA了数次。
后来党说可以用位运算,可怜的我位运算忘得一塌糊涂。。。翻了翻谭浩强的那本绿书。。。
呃。这个用异或运算很水啊。。。就是这个^。。
两个数字相异或,得出的是他们二进制相同为0,不同为1,然后找这个数字的二进制有多少个1就是要求的差异个数
从图书馆回来写了,可惜比赛时间到了。。。
一个83行,笨方法,把数的二进制表示出来,再一一对比。。。另一个45行。。。差距啊差距。。。
x = x&(x-1); 这个也是x /= 2的意思,但是比/=2快。。。 ZOJ这题出来了,和党改了半天。。。 = = 把排名刷上去了。。。
真幼稚呀真幼稚。。。
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> #include <stack> #include <math.h> #include <limits.h> #include <algorithm> using namespace std; stack<int> s; int binm[110][100]; int binn[110][100]; int mm[110],nn[110],lenm[110],lenn[110]; int cmp(int x,int y) { int cou = 0; for(int i=0; i<max(lenn[x],lenm[y]); i++) if( binn[x][i] != binm[y][i] ) cou++; return cou; } int main(void) { int ncases,m,n; scanf("%d",&ncases); while( ncases-- ) { memset(lenm,0,sizeof(lenm)); memset(lenn,0,sizeof(lenn)); memset(binm,0,sizeof(binm)); memset(binn,0,sizeof(binn)); scanf("%d%d",&m,&n); for(int i=0; i<m; i++) scanf("%d",&mm[i]); for(int i=0; i<n; i++) scanf("%d",&nn[i]); sort(mm,mm+m); for(int i=0; i<m; i++) { int num = mm[i]; int k=0; while( num ) { binm[i][k] = num % 2; num/=2; k++; } lenm[i] = k; } for(int i=0; i<n; i++) { int num = nn[i]; int k=0; while( num ) { binn[i][k] = num % 2; num/=2; k++; } lenn[i] = k; } for(int i=0; i<n; i++) { int min = INT_MAX,temp; for(int k=0; k<m; k++) { int sum = cmp(i,k); if( sum < min ) { temp = mm[k]; min = sum; } } printf("%d",temp); if( !(ncases == 0 && i == n-1) ) printf("/n"); } } return 0; }
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> #include <algorithm> using namespace std; int main(void) { int ncases,m,n; int mm[110],nn[110]; scanf("%d",&ncases); while( ncases-- ) { scanf("%d%d",&m,&n); for(int i=0; i<m; i++) scanf("%d",&mm[i]); for(int i=0; i<n; i++) scanf("%d",&nn[i]); sort(mm,mm+m); for(int i=0; i<n; i++) { int temp,min = INT_MAX; for(int k=0; k<m; k++) { int x = mm[k]^nn[i]; int sum = 0; while(x) { sum += x%2; x /= 2; } if( sum < min ) { temp = mm[k]; min = sum; } } printf("%d/n",temp); } } return 0; }