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

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

原文地址:https://www.cnblogs.com/linzhengmin/p/9343550.html