zoukankan      html  css  js  c++  java
  • P1582倒水 位运算

    题目描述

    一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子。每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃。(不能丢弃有水的瓶子)

    显然在某些情况下CC无法达到目标,比如N=3,K=1。此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标。

    现在CC想知道,最少需要买多少新瓶子才能达到目标呢?

    输入输出

    输入格式: 

    一行两个正整数, N,K(1N2e9,K1000 )。

    输出格式:

    一个非负整数,表示最少需要买多少新瓶子。

    样例

    输入样例#1: 3 1
    输出样例#1:  1
     
    输入样例#2: 13 2
    输出样例#2: 3
     
     
    分析:
    显然与二进制有关,我们最后的ans一定是k个2的幂次相加最接近n的最小值,考虑从最后往前的第一个1开始加起,直到1的个数等于k为止。
    ps:最后一个1为x^-x
    代码:
     1 #include"bits/stdc++.h"
     2 #define ci(x) scanf("%d",&x)
     3 #define pi(x) printf("%d
    ",x)
     4 using namespace std;
     5 int n,k;
     6 int work(int x){
     7     int cnt=0;
     8     for(;x;x-=x&-x) cnt++;
     9     return cnt;
    10 }
    11 int main() {
    12     ci(n),ci(k);
    13     int ans=0;
    14     while(work(n)>k) ans+=n&-n,n+=(n&-n);
    15     pi(ans);
    16 }
  • 相关阅读:
    memcached客户端memadmin安装使用
    git之一: 在windows下安装git和使用总结
    nginx常用命令
    mysql授权 REVOKE 添加用户等
    mysql密码忘记解决
    个人常用alias
    解决zabbix图形界面中文乱码
    JsonPath的使用
    Httpclient 支持https(转)
    字符串拼接‘+’实现
  • 原文地址:https://www.cnblogs.com/mj-liylho/p/9393042.html
Copyright © 2011-2022 走看看