题目大意:给出一个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; }