ZZULIOJ 1832 贪吃的松鼠 (位运算)

1832: 贪吃的松鼠

Time Limit: 3 Sec   Memory Limit: 2 MB
Submit: 132   Solved: 27

Submit Status Web Board

Description

冬天到了,n只松鼠决定一起采集一波坚果过冬,可是在松鼠老大清点的时候,发现少了一些食物,于是召开松鼠大会,知道是有一只小松鼠偷吃了一部分食物!可是他们只知道每一个松鼠运了m个,但是某一个只松鼠运了k个,请找出这个松鼠!(本题时限3s  限制内存2M)

Input

输入有多组数据,每组第一行包含三个数n,m,k(n<=100000,1<m<=9,k<m)。
然后输入m*(n-1)+k个数,第i个数表示运送第i个坚果的松鼠编号,编号范围在2^30以内

Output

输出这个松鼠的编号

Sample Input

3 3 2
1 2 1 2 1 2 3 3

Sample Output

3

HINT

Source

zufe院赛

很奇妙的一道题,利用了位运算,将每一个数都转换为二进制数存入数组,如果一个数出现M次,那么他的对应位上应该是m的倍数,如果不是就找到了出现k次对应的二进制位数,再转换为十进制就AC了。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[1100];
int main()
{
	int i,j,k,n,m,t;
	while(scanf("%d%d%d",&n,&m,&k)!=EOF)
	{
		memset(a,0,sizeof(a));
		for(i=0;i<m*(n-1)+k;i++)
		{
			scanf("%d",&t);
			for(j=0;j<31;j++)
			{
				a[j]+=t%2;
				t=t/2;	
			}
		}
		long long sum=0;
		for(i=0;i<31;i++)
		{
			if(a[i]%m==0)
			continue;
			else
			sum+=1<<i;
		}
		printf("%lld\n",sum);
	}
	return 0;
 } 


你可能感兴趣的:(ZZULIOJ 1832 贪吃的松鼠 (位运算))