zoukankan      html  css  js  c++  java
  • [XJOI]二进制中连续k个1 题解

    原题传送门[>XJOI<]    重要提示:您的等级必须达到三级五段,否则会被一只小猫痛扁

    题目描述:

    求最小的m,使得m>=n而且m的二进制表示包含至少连续k个1

    输入格式:

    输入两个整数n,k

    输出格式:

    输出一个整数

    样例输入1:

    7 2
    

    样例输出1:

    7

    样例输入2:

    364269800189924 33

    样例输出2:

    364273356242943

    约定:

    0<=n<250,1<=k<=50

     

    解法:

      今天没什么时间,我先简单讲讲

      很简单,枚举长度为k的一段1,再在其他位上添加1使得m>=n

    代码:(不要抄袭*INF)

      

    #include <cstdio>
     
    long long bin[55];
     
    int main()
    {
        long long n, k;
        scanf("%lld %lld", &n, &k);
        long long _bin = 1;
        bin[0] = 1;
        for (int i = 1; i <= 50; i++)
        {
            bin[i] = bin[i-1]*2;
        }
        long long k1 = 1;
        for (int i = 0; i < k; i++)
            k1 *= 2;
        k1--;
        long long temp, ans = 2251799813685248, cur_ans;
        if (k1 > n)
            printf("%lld", k1);
        else
        {
            while (k1 <= n)
            {
                temp = n - k1;
                cur_ans = k1;
                for (int i = 50; i >= 0; i--)
                {
                    if (temp >= bin[i] && !(bin[i] & k1))
                    {
                        temp -= bin[i];
                        cur_ans += bin[i];
                    }
                    else if(cur_ans + bin[i] < ans && !(bin[i] & k1))
                    {
                        ans = cur_ans + bin[i];
                    }
                }
                if (temp == 0)
                {
                    if (cur_ans < ans)
                        ans = cur_ans;
                }
                k1*=2;
            }
            printf("%lld", ans);
        }
        return 0;
    }

    本篇博文全部原创,未经博主允许禁止转载

  • 相关阅读:
    第二次结对编程作业
    第5组 团队展示
    第一次结对编程作业
    第一次个人编程作业
    51 Nod 1024 Set
    51 Nod 1007 dp
    YY的GCD 数学
    选课 树形背包dp
    运输问题 费用流
    分配问题 费用流
  • 原文地址:https://www.cnblogs.com/linzhengmin/p/9343550.html
Copyright © 2011-2022 走看看