UVA - 10718 Bit Mask 贪心
2014-11-05 21:21
393 查看
题目大意:给出一个数字N,在给出一个空间,要求在这个空间内取一个值和N做或运算,要求或的结果达到最大
解题思路:贪心,尽力把数字N中为0的位转化为1。将N中为0的位转化为1,取最小值和最大值,看区间是否相交,如果相交的话,表示这个可以转换为1。如过N上的位为1的话,那就得判断一下在不加上这一位的情况下是否会和区间相交,如果没有相交的话,则后面的数如果都为1也是没用的,因为总是和前一位差1,如果不相交的话就得加上去
解题思路:贪心,尽力把数字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; }
相关文章推荐
- UVA 10718 Bit Mask (快速幂 + 贪心)
- UVA 10718 Bit Mask 贪心+位运算
- UVA - 10718 Bit Mask(贪心+位运算)
- uva10718 - Bit Mask(贪心)
- uva 10718 Bit Mask(贪心)
- UVa 10718 Bit Mask (贪心&位运算)
- uva 10718 Bit Mask(位操作贪心)
- UVA 10718 Bit Mask 贪心+位运算
- uva10718 - Bit Mask(贪心)
- [贪心]UVA10718 Bit Mask
- UVa10718 - Bit Mask(不错的贪心)
- uva 10718 Bit Mask(贪心)
- uva 10718 Bit Mask (位运算)
- UVa 10718 - Bit Mask
- uva 10718 Bit Mask (位运算)
- uva 10718 Bit Mask
- UVA 10718 Bit Mask
- uva 10718 Bit Mask
- uva 10718 Bit Mask (位运算)
- uva 10718(贪心)