洛谷P1582 倒水 二进制的相关应用

https://www.luogu.org/problem/P1582

#include<bits/stdc++.h>
using namespace std;
long long N,K,x,ans,k;
bool a;
int main() {
    cin>>N>>K;
    for(register int i=N; i>0;) {  // register关键字请求让编译器将变量a直接放入寄存器里面,以提高读取速度 
        if(i%2==1) {
            x++;
        }
        i>>=1;    //二进制下为除去最后一位,十进制下为除以2 
    }
    if(x<=K) {
        cout<<0<<endl;
        return 0;    //如果此时最终合并的数目就小于等于K,则不用买,直接输出 
    }
    for(register int j=1;;) {       
        k=0;
        x=0;
        a=false;
        for(register int i=N+j; i>0;) {      
            if(i%2==1) {
                x++;
                a=true;
            }
            if(a==false&&i%2==0) {   //二进制下从右向左寻找第一个1 位置   
                k++;
            }
            i>>=1;                  //除去二进制最后一位 或者在十进制下除以2 
        }
        if(x<=K) {          //如果加1之后最终合并的个数x小于K 则直接输出j 
            ans=j;
            break;    
        }                   //假设二进制下从右向左第一位就是1,那么就不会进入第二个if,然后一直循环,算出1
                            //的数量,然后判断是否小于K,如果不满足,就在第一位,即第一个1的位置让他再加1,这是二进制下的加,要换算成十进制 
        j=j+pow(2,k);      //如果不行,二进制下自加一个1,直到成立   然后进入一下次循环,首先清零,寻找第一个1的位置 
    }
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11707169.html