您的位置:首页 > 其它

UVA - 10718 Bit Mask 贪心

2014-11-05 21:21 393 查看
题目大意:给出一个数字N,在给出一个空间,要求在这个空间内取一个值和N做或运算,要求或的结果达到最大

解题思路:贪心,尽力把数字N中为0的位转化为1。将N中为0的位转化为1,取最小值和最大值,看区间是否相交,如果相交的话,表示这个可以转换为1。如过N上的位为1的话,那就得判断一下在不加上这一位的情况下是否会和区间相交,如果没有相交的话,则后面的数如果都为1也是没用的,因为总是和前一位差1,如果不相交的话就得加上去

#include<cstdio>
#include<cstring>
const int maxn = 35;
long long N,L,U,b[maxn];
int a[maxn];
void init() {
	b[0] = 1;
	for(int i = 1; i <= 32; i++)
		b[i] = b[i-1] * 2;
}

int main() {

	init();
	while(scanf("%lld%lld%lld",&N,&L,&U) != EOF) {
		for(int i = 31; i >=0; i--) {
			if( (1<<i) & N)	
				a[i] = 1;
			else
				a[i] = 0;
		}
		long long x, y,ans = 0;	
		for(int i = 31; i >= 0 ; i--)
			if(a[i] == 0) {
				x = ans + b[i];
				y = ans + b[i+1] -1;
				if( x<= U && y >= L)
					ans = ans + b[i];
			}
			else {
				x = ans;
				y = ans + b[i] - 1;	
				if( x > U || y < L)
					ans = ans + b[i];
			}
		printf("%lld\n",ans);	
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: