九度oj 1380 lucky number + 二进制

题目链接 点击打开链接

题目1380:lucky number

时间限制:3 秒

内存限制:3 兆

特殊判题:

提交:2842

解决:301

题目描述:
每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然这样,他就想找到那些不是lucky number。
输入:
输入有两行.
第一行有n和m。n表示出现次数为n的是lucky number,m表示序列的长度。2<=n<=10,m<=10^6,m%n!=0。
第二行为序列元素,每个元素都是正整数。
输出:
输出那个不是lucky number的数。题目保证非lucky number只有一个。
样例输入:
2 5
1 1 2 2 3
样例输出:
3
分析:

用map容易超内存,用一般的方法容易超时,利用二进制计算每位数量,然后利用关系式 m%n!=0 可以得到,满足关系式的位数保存,换成十进制数即为最终的lucky number ,但用java实现时,还得注意 输入,否则也超时

代码如下:

import java.io.*;
import java.util.*;


public class Main {
	  
	   public static void main(String[] args) throws IOException{
		   
		     Scanner cin = new Scanner(new InputStreamReader(System.in));
		     StreamTokenizer stcin = new StreamTokenizer(System.in) ;
		     PrintWriter cout = new PrintWriter(System.out) ;
		     while(stcin.nextToken() != StreamTokenizer.TT_EOF){
		    	 new Task().solve(stcin , cout) ;
		    	 
		     }
		     cout.flush();
		     cout.close();
 	   }		

}

class Task{
	int n , m ;
	static int[] bit = new int[32] ;
	static{
		bit[0] = 1 ;
		for(int i =1  ; i <= 31 ; i++) bit[i] = bit[i-1]<< 1 ;
	}
	void solve(StreamTokenizer cin , PrintWriter cout)throws IOException {
		n = (int)cin.nval ;
		cin.nextToken() ;
		m = (int)cin.nval ;
		int [] bitSize = new int[32] ;
		Arrays.fill(bitSize, 0);
		for(int i =1 ; i<= m ; i++){
			cin.nextToken() ;
			int x = (int)cin.nval ;
			for(int j = 0 ; j<= 31 ; j++){
				bitSize[j] += (x & bit[j]) > 0 ? 1 : 0 ;
			}
		}
		int ans = 0 ;
		for(int i= 0 ; i<= 31 ; i++){
			bitSize[i] %= n ;
			if(bitSize[i] > 0) 
				ans += bit[i] ;
		}
		cout.println(ans);
		//cout.flush();
	}
}




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值