UVa 10718 - Bit Mask
来源:互联网 发布:西门子plc编程软件xp 编辑:程序博客网 时间:2024/05/22 03:48
贪心,M在保证与N做OR运算的结果最大的基础上,使M的值最小。
可以先将上界和下界都转化为二进制,先确定M的最高位,M的最高位可以从u的最高位开始试(理由很简单),再依次确定之后的数字,每个数字尽量保证与N的二进制相应位置的数字互补(如果N的二进制的某一位是 1,则M的相应位尽量为0,这样才也能保证总值最大,M值尽量小),但也要保证在每一位贪心的过程不能使M值超过[N,M]的范围。
代码如下:
#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<cmath>#include<ctime>using namespace std;void D_bite(char *str, unsigned long long num) // 将数字化成二进制{ if(!num) str[0] = '0'; else for(int i = 0; num; i++) { str[i] = num % 2 + '0'; num /= 2; }}unsigned long long B_dight(char *str, int len) // 将二进制化成数字{ unsigned long long num = 0; for(int i = 0; i < len; i++) if(str[i] == '1') num += (1LL << i); return num;}int main(){#ifdef test freopen("in.txt", "r", stdin);#endif unsigned long long l, u, n; char U[65], M[65], L[65], N[65]; while(scanf("%llu%llu%llu", &n, &l, &u) != EOF) { memset(U, 0, sizeof(U)); memset(N, 0, sizeof(N)); memset(M, 0, sizeof(M)); memset(L, 0, sizeof(L)); D_bite(U, u); D_bite(L, l); D_bite(N, n); int len_u = strlen(U), len_m = len_u, len_l = strlen(L); M[len_m - 1] = '1'; if(!u) // 当上界为0时,需要特殊处理 M[len_m - 1] = '0'; while(1) { if(N[len_m - 1] == '1' && len_m > len_l) { --len_m; M[len_m] = '\0'; M[len_m - 1] = '1'; } else break; } int ffct = len_m - 1; for(int i = 0; i < len_m - 1; i++) M[i] = '0'; while(ffct >= 0) { if(N[ffct] != '1') { M[ffct] = '1'; if(B_dight(M, len_m) > u) // 相应位置赋为‘1’时,考虑是否超上界 M[ffct] = '0'; } else { M[ffct] = '0'; if(B_dight(M, len_m) < l) // 相应位置赋为‘0’时,考虑是否超下界 { memset(M, '1', sizeof(M[0]) * ffct); if(B_dight(M, len_m) < l) M[ffct] = '1'; memset(M, '0', sizeof(M[0]) * ffct); } } --ffct; } printf("%llu\n", B_dight(M, len_m)); } return 0;}
- 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 - 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 Bit Mask(贪心)
- SecureCRT中文乱码解决方案(http://www.bootf.com/547.html)-开始学习使用linux
- 11gr2 Rac 升级 11.2.0.1 ---> 11.2.0.3
- android学习之绘图和触摸事件结合的小例子
- 下载googlecode为SVN客户端设置代理
- atoi函数
- UVa 10718 - Bit Mask
- 已知两点经纬度,求这两点连成的直线的角度
- POJ 1733 Parity game
- 数据结构与算法分析-第一章Java类(02)
- 如何判断一个指定的经纬度点是否落在一个多边形内
- Android入门/AlertDialog(十)
- 静态数据成员
- 身份证号码检测
- arm-linux-gcc安装