zoukankan      html  css  js  c++  java
  • UVa 10718 Bit Mask

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1659

    题意:给出数N, L, U, 求一个数M, L ≤ M ≤ U,使得 N 与 M 按位或运算的结果最大,求最小的 M。

    分析:贪心。从最高位开始枚举,如果 N 的二进制表示形式的第 i 位是0,那么就尽可能让 M 的第 i 位在给定范围内是1。如果 N 的二进制表示形式的第 i 位是1,因为要求最小的M,则 M 的第 i 位要在给定范围内尽可能是0。 

     1 #include <cstdio>
     2 
     3 int main()
     4 {
     5     unsigned int N, L, U, M;
     6     int i;
     7     while ( scanf("%u%u%u", &N, &L, &U) != EOF )
     8     {
     9         M = 0;
    10         for ( i = 31; i >= 0; i-- )
    11         {
    12             M += ( 1 << i );
    13   //          printf( "%d\n", M );
    14             if ( M > U )
    15             {
    16                 M -= ( 1 << i );
    17                 continue;
    18             }
    19             if ( N & ( 1 << i ) )
    20             {
    21                 if ( M >= L )
    22                 {
    23                     M -= ( 1 << i );
    24                 }
    25             }
    26 //            printf( "%u\n", M );
    27         }
    28         if ( M < L ) M += 1;
    29         printf( "%u\n", M );
    30     }
    31     return 0;
    32 }
  • 相关阅读:
    NYOJ47 过河问题
    CodeForces1165
    LuoGuP3667
    ZROI#958
    ZROI#957
    KMP小结
    LuoGuP2742[模板]二维凸包
    ZROI#999
    ZROI#997
    ZROI#996
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/2669689.html
Copyright © 2011-2022 走看看