codeforces 1491D(二进制)

题目
题意:当u&(u+v)时,u可以到v,判断u是否可以到v
思路:1、当u>v时false
2、当u中得1 得个数少于v中1的个数的时候false
3、对与v中的所有的1,在u的对应左边都会有1否则false
4、剩下的true

AC代码:

package 练习;
import java.io.*;
import java.lang.*;
import java.util.*;
import java.io.*;
import java.util.*;
public class Main{
	static Scanner scanner=new Scanner(System.in);
	public static void main(String[] args) {
		int q=scanner.nextInt();
		while(q-->0) {
			int u=scanner.nextInt();
			int v=scanner.nextInt();
			boolean b=true;
			if(u>v) {System.out.println("No");continue;}
			int x=u,y=v;
			int xx=0,yy=0;
			while(x>0) {xx+=x%2;x/=2;}
			while(y>0) {yy+=y%2;y/=2;}
			if(xx<yy) {System.out.println("No");continue;}
			Queue<Integer>xQueue=new LinkedList<Integer>();
			Queue<Integer>yQueue=new LinkedList<Integer>();
			int s=0;
			while(u>0) {
				if(u%2==1)xQueue.add(s);
				u/=2;
				s++;
			}
			s=0;
			while(v>0) {
				if(v%2==1)yQueue.add(s);
				v/=2;
				s++;
			}
			while(!yQueue.isEmpty()) {
				if(yQueue.poll()<xQueue.poll()) {
					b=false;
					break;
				}
			}
			if(b)System.out.println("Yes");
			else System.out.println("No");
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值