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;}


原创粉丝点击