uva 10718 Bit Mask(贪心)

题目连接: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
", solve());
    }
    return 0;
}
原文地址:https://www.cnblogs.com/suncoolcat/p/3294093.html