uva 10718 Bit Mask(贪心)

942 篇文章 2 订阅
119 篇文章 0 订阅

题目连接:10718 Bit Mask


题目大意:给出一个T, 和一个下限L, 上限R, 在[L, R]之间找一个数, 使得这个数与T做或运算之后的数值最大 输出这个数。


解题思路:将T转换成二进制,对应的为0的地方要填1, 为1的地方填0, 判断的时候还要考虑上下限的问题。


#include <stdio.h>
#include <string.h>
const int M = 32;

long long T, L, R;
int tmp[M + 1], Max[M + 1], Min[M + 1], ans[M + 1];

void getBase(long long cur, int now[]) {
    memset(now, 0, sizeof(now));
    for (int i = 0; i <= M; i++) {
	now[i] = cur % 2;
	cur /= 2;
    }
}

long long solve() {
    getBase(T, tmp);
    getBase(R, Max);
    getBase(L, Min);
    int Maxflag = 0, Minflag = 0;
    memset(ans, 0, sizeof(ans));

    for (int i = M; i >= 0; i--) {
	if (tmp[i] == 0 && Maxflag) {
	    ans[i] = 1;
	    if (Min[i] == 0)    Minflag = 1;
	}
	else if (tmp[i] && Minflag) {
	    ans[i] = 0;
	    if (Max[i])	Maxflag = 1;
	}
	else if (tmp[i]) {
	    if (Min[i] == 0) {
		ans[i] = 0;
		if (Max[i])	Maxflag = 1;
	    }
	    else if (Min[i])	ans[i] = 1;
	}
	else {
	    if (Max[i]) {
		ans[i] = 1;
		if (Min[i] == 0)    Minflag = 1;
	    }
	    else if (Max[i] == 0)   ans[i] = 0;
	}
    }

    long long sum = 0;
    for (int i = M; i >= 0; i--)
	sum = sum * 2 + ans[i];

    return sum;
}

int main() {
    while (scanf("%lld%lld%lld", &T, &L, &R) == 3) {
	printf("%lld\n", solve());
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值