读书人

UVA 10718 Bit Mask 贪心+位演算

发布时间: 2013-09-06 10:17:17 作者: rapoo

UVA 10718 Bit Mask 贪心+位运算

题意:给出一个数N,下限L上限U,在[L,U]里面找一个整数,使得N|M最大,且让M最小。

很明显用贪心,用位运算搞了半天,样例过了后还是WA,没考虑清楚。。。

然后网上翻到了一个人家位运算一句话解决了 = =....ORZ...

人家的分析:(by天然呆大神)

量 N 中 0 的位元,M 1;N 1 的位元, M 0。
因此高位往低位查,
如果 N 1(M 量 0),若 M 不能 0,必是因 M 1 仍小於 L;
如果 N 0(M 量 1),若 M 不能 1,必是因 M 0 仍大於 U(此不可能),
句,M 1 ,M 需不大於 U。


注意:如果是long long的位运算操作,最好在数后面加个LL,不如会溢出的。


代码:

 /* *   Author:        illuz <iilluzen[at]gmail.com> *   Blog:          http://blog.csdn.net/hcbbt *   File:          uva10718.cpp *   Lauguage:      C/C++ *   Create Date:   2013-09-04 09:26:39 *   Descripton:    UVA 10718 Bit Mask, bitmap, greed */#include <cstdio>#include <cmath>#define repd(i, a, b) for (int i = (a); i >= (b); i--)const int MAXN = 100;int main() {long long n, l, u, m, t;while (scanf("%lld%lld%lld", &n, &l, &u) != EOF) {int len = ceil(log(u) / log(2));m = 0;repd(i, len, 1) {t = m | (1LL << (i - 1));//1if (n >> (i - 1) & 1) {if (t <= l) m = t;}else {if (t <= u) m = t;}}printf("%lld\n", m);}return 0;}


读书人网 >编程

热点推荐