题目:http://www.nbuoj.com/v8.83/Problems/Problem.php?pid=2784

一天,TJ买了N个容量无限大的瓶子,开始时每个瓶子里有1升水。接着TJ决定只保留不超过K个瓶子。每次他选择两个含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃。

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

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

输入:

每组一行两个正整数, N,K(1≤N≤2e9,K≤1000 )。

样例:

input:

2
3 1
13 2

output:

1
3

思路:

①直接枚举(竟然不会超时)

②可以把瓶子转换成二进制的数,例如n=13如果不买新瓶子最终能变成8,4,1,想要瓶子数不增加,只能买n的二进制位最小的1的数量的瓶子,例如13要买1个瓶子,12要买4个瓶子,8要买8个瓶子。这是对购买数量的剪枝。记得特判,/(ㄒoㄒ)/~~

官方题解:

附上本蒟蒻的代码:

暴力,__builtin_popcount(n)求n的二进制时1的个数:

#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k,ans;
cin>>n>>k;
int tmp=__builtin_popcount(n);
if(k>=tmp)ans=;
else
{
for(int i=n;;i++)
{
int tmp2=__builtin_popcount(i);
if(tmp2<=k)
{
ans=i;
break;
}
}
ans=ans-n;
}
cout<<ans<<endl;
}
return ;
}

lowbit()优化,lowbit()是求x的二进制时最低位的1的2^k的值,cal()是求n的二进制时1的个数:

#include<bits/stdc++.h>
using namespace std;
int lowbit(int x)
{
return x&-x;
}
int cal(int x)
{
int cnt=;
while(x)
{
cnt++;
x&=(x-);
}
return cnt;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k,ans=;
cin>>n>>k;
while(cal(n)>k)
{
ans+=lowbit(n);
n+=lowbit(n);
}
cout<<ans<<endl;
}
return ;
}

想了解更多lowbit(),出门左拐搜树状数组

												

nbuoj2784 倒水的更多相关文章

  1. 广度优先搜索 cdoevs 1226 倒水问题

    cdoevs 1226 倒水问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升 ...

  2. 倒水问题 (codevs 1226) 题解

    [问题描述] 有两个无刻度标志的水壶,分别可装x升和y升 ( x,y 为整数且均不大于100)的水.设另有一水缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒.已知x升壶为空壶, ...

  3. POJ 3414 Pots【bfs模拟倒水问题】

    链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...

  4. yzoi1777倒水问题的详细解法

    Description - 问题描述 x.y.z三个容器,其最大容量分别是xMAX升.yMAX升.zMAX升,这里规定100>xMAX>yMAX>zMAX.一开始x是装满了水的,现在 ...

  5. codevs1226倒水问题(Bfs)

    /* 首先建立模型 可以看成是三个水杯 第三个无穷大 (这里看成是201足够了) 最少步数 想到Bfs 维护队列里的状态:要有个步数 还要有v :此时刻三个杯子有多少水 然后倒水:因为没有刻度 所以有 ...

  6. 倒水问题-->经典面试题目

    题目详细: 有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水.我们还有一个足够大的水缸,足够容纳C升水.起初它是空的,我们只能往水缸里倒入水,而不能倒出.可以进行的操作是:把一个容器灌满 ...

  7. 倒水问题 (FillUVa 10603) 隐式图

    题意:本题的题意是给你三个杯子,第一二个杯子是空的,第三个杯子装满水,要求是量出一定容量d升的水.若是得不到d升的水,那就让某一个杯子里面的水达到d',使得d'尽量接近d升. 解题思路:本题是给出初始 ...

  8. uva10603 倒水问题

    状态搜索.类似八数码问题 AC代码 #include<cstdio> #include<queue> #include<cstring> #include<a ...

  9. 美团codeM预赛A轮 倒水

    [编程题] 倒水 时间限制:1秒 空间限制:32768K 有一个大水缸,里面水的温度为T单位,体积为C升.另有n杯水(假设每个杯子的容量是无限的),每杯水的温度为t[i]单位,体积为c[i]升. 现在 ...

随机推荐

  1. win7设置docker默认服务端地址

    目录 win7设置docker默认服务端地址 1.开启docker远程访问 2.本地调整 2.1 docker.exe重命名 2.2 添加docker.bat 2.3 添加快速切换功能 3.使用验证 ...

  2. 服务器spring boot版本,平滑升级

    1.在pom文件中加入: <!--平滑升级包 开始 --> <dependency> <groupId>org.springframework.boot</g ...

  3. c#属性(Property)

    属性(Property)是类(class).结构(structure)和接口(interface)的命名(named)成员.类或结构中的成员变量或方法称为 域(Field).属性(Property)是 ...

  4. Jenkins 与Docker/Kubernetes的自动化CI流水(笔记)

    一.CI/CD 持续集成(continuous Integration,CI):代码合并.构建.部署.测试都在一起.不断执行这个过程,并对结果反馈. 持续部署(Continuous Deploymen ...

  5. 树莓派debian配置lamp[解决Apache不显示php网页]

    Apache + MySql + Php. 1.安装Apache Apache可以用下面的命令来安装 sudo apt-get install apache2 Apache默认路径是/var/www/ ...

  6. count的一些用法

    count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL  count(1)包括了所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL  count(列名)只包 ...

  7. mysql 创建用户及授权(1)

    一. 创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用户名 host:指定该用户 ...

  8. pat 1042 Shuffling Machine(20 分)

    1042 Shuffling Machine(20 分) Shuffling is a procedure used to randomize a deck of playing cards. Bec ...

  9. mysql 索引笔记

    MyISAM引擎的B+Tree的索引 通过上图可以直接的看出, 在MyISAM对B+树的运用中明显的特点如下: 所有的非叶子节点中存储的全部是索引信息 在叶子节点中存储的 value值其实是 数据库中 ...

  10. C语言|博客作业04

    这个作业属于哪个课程 C语言程序设计II 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/9768 我在这个课程的 ...