zoukankan      html  css  js  c++  java
  • 洛谷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;
    }
  • 相关阅读:
    每日英语:Yahoo's Rally: Made in China
    【Java线程】Callable和Future
    Throwable和Exception的区别
    Java异常分类
    牛客网上的剑指offer题目
    合并两个排序的链表
    反转链表
    链表中倒数第k个结点
    调整数组顺序使奇数位于偶数前面
    数值的整数次方
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11707169.html
Copyright © 2011-2022 走看看