• 待修改 nyoj 412 又是一个遗留问题


    测试的数据都正确啊,跟别人正确代码也对比了一下,一直wrong ans,这道题是搞不定了,思路是这样的,一个int 的数,

    例如 一个数的二进制是1001100,那么大于这个数的最小的有相同个数1的数是都少?

    我的思路是这样:既然最小那么我就每次加一试试:,然后判断1个数是否相同,以上个数为例。

    10011_01 10011_10 10011_11    到此为止,1的个数一直在增加

    添加多少1呢? 添加在哪里呢?

    10100—00 中1的位置,到 1001100中1的位置。为   5-3-1=1;

    所以加一个1,最小当然添加在最后一位了。如果是2呢,则添加在最后两位。总之添加在最低位,

    1010001

    不细说了,同学们可以不断的加一观察很快就发现了。

    ps:   x&-x表示最低位1的权值,具体讨论可以做一下树状数组。

    #include<iostream>
    #include<math.h>
    //x&-x 为x的二进制中最低位1的权值 列: 110010为 2  11100为4 ,所以 log2(4)表示最低位1在第2位
    using namespace std;
    int lowbit(int n)
    {
        return log(n&-n)/log(2);
    
    }
    int main()
    {
        int n;
        while(cin>>n)
        {
            int pos1=lowbit(n);
            
            int n2=lowbit(n+n&-n);
            //cout<<"hello"<<pos1<<n2<<endl;
            int ne=n+(n&-n);
            
            int count=n2-pos1-1;
            int a=1;
            for(int i=0;i<count;i++)
            {
                ne+=a;
                a=a<<1;
            
            }
            cout<<ne<<endl;
        
        }
        
    
    
    return 0;
    }
  • 相关阅读:
    js18
    js17
    js16
    js15
    js14
    js13
    js12
    js11
    八月二十三的php
    八月二十二的php
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/3804856.html
Copyright © 2020-2023  润新知