uva 10718 Bit Mask (位运算)


 

uva 10718  Bit Mask  (位运算)



Problem A

Bit Mask

Time Limit

1 Second

 

In bit-wise expression, mask is a common term. You can get a certain bit-pattern using mask. For example, if you want to make first 4 bits of a 32-bit number zero, you can use 0xFFFFFFF0 as mask and perform a bit-wise AND operation. Here you have to find such a bit-mask.

Consider you are given a 32-bit unsigned integer N. You have to find a mask M such that L ≤ M ≤ U and N OR M is maximum. For example, if is 100 and L = 50, U = 60 then M will be 59 and N OR M will be 127 which is maximumIf several value of M satisfies the same criteria then you have to print the minimum value of M.

Input
Each input starts with 3 unsigned integers NLU where L ≤ U. Input is terminated by EOF.

Output
For each input, print in a line the minimum value of M, which makes N OR M maximum.

Look, a brute force solution may not end within the time limit.

Sample Input

Output for Sample Input

100 50 60
100 50 50
100 0 100
1 0 100
15 1 15

59
50
27
100
1


Problem setter: Md. Kamruzzaman
Member of Elite Problemsetters' Panel


这题很简单,从最高位开始逐位判断,如果N的该位为0,为使M | N的值最大,M的该位应考虑置为1,然后判断M的该位为1时的可能取值区间[lmin, lmax],如果区间[lmin, lmax]与区间[L, U]有交集,则说明该位可置为1;如果N的该位为1,为使M的值尽可能小,M的该位应考虑置为0,然后判断可能取值区间与[L, U]是否有交集,如果没有交集,该位置为1。


 

#include <iostream>

#include <cstdio>

#include <algorithm>

using namespace std;



long long n,l,r,a[100],b[100];

int cnta,cntb;



void get(){

	long long x=n;

	cnta=0;cntb=0;

	while(x>0){

		a[cnta++]=x%2;

		x/=2;

	}

	x=r;

	while(x>0){

		b[cntb++]=x%2;

		x/=2;

	}

}



void computing(){

	long long ans=0;

	if(cntb>cnta){

		for(int i=cntb-1;i>cnta-1;i--){

			long long tmp=(long long)1<<(long long)i;//此处不强转,会超出int范围,wa了几次

			if(b[i]==1){

				l-=tmp;

				r-=tmp;

				ans+=tmp;

			}

		}

	}

	for(int i=cnta-1;i>=0;i--){

		long long tmp=(long long)1<<(long long)i;

		if(tmp<=l){

			l-=tmp;

			r-=tmp;

			ans+=tmp;

		}

		else if(a[i]==0 && tmp<=r){

			l-=tmp;

			r-=tmp;

			ans+=tmp;

		}

	}

	printf("%lld\n",ans);

} 



int main(){

	while(scanf("%lld%lld%lld",&n,&l,&r)!=EOF){

		get();

		computing();

	}

	return 0;

}

 


 

AC不了,请尝试以下测试数据:

INPUT:
22 1 21

17 3 5

12 9 17

622 435 516

774 887 905

398 119 981

550 99 427

823 684 966

22398 14719 27341

29787 21141 30633

3113 24242 29497

5021 11052 19571

7359 6669 19790

993331 367623 921769

810986 227838 492138

987964 208251 1034287

1002648 217556 236589

680047 402532 767548

27719912 10747535 22001285

16862072 13339946 28844391

20421198 11724734 31928748

1541522 10226990 20764468

22651935 2478699 31095674

1995360670 908222743 1868651617

305542918 594331857 1426036714

1265639777 1580376576 1885248297

1442823820 658800174 1919310996

604563406 1050668699 2128532112

1          0        4294967295



OUTPUT:
9

4

17

435

905

625

409

712

14721

23460

29462

19554

17216

382924

237589

257219

234343

499600

14223127

16692359

13133233

19429997

10902496

957429345

1305069817

1880088222

704659827

1542920241

4294967294



你可能感兴趣的:(位运算)