您的位置:首页 > 其它

zoj 3418 || The 2010 ACM-ICPC Asia Chengdu Regional Contest - C Binary Number

2010-11-13 17:52 357 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐