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

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

  • 相关阅读:
    layui 相关知识
    ideal debug 启动不起来
    删除命令 rm -rf maven-project-jxcg.zip 解压 unzip maven-project-jxcg.zip
    vsb 配置
    cmd dos
    switch
    Element UI 框架搭建
    mysql 远程连接设置
    YApi可视化接口管理平台 接口
    报403错误
  • 原文地址:https://www.cnblogs.com/linzhengmin/p/9343550.html
Copyright © 2020-2023  润新知