题目: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. Windows系统下搭建WAMP环境

    Wamp就是Windos Apache Mysql PHP集成安装环境,即在window下的apache.php和mysql的服务器软件.其中php环境配置是至关重要的一部分,本文就针对php在本地的 ...

  2. [UWP]使用Win2D的BorderEffect实现图片的平铺功能

    1. WPF有,而UWP没有的图片平铺功能 在WPF中只要将ImageSource的TileMode属性设置为Tile即可实现图片的平铺,具体可见WPF的这些文档: ImageBrush 类 (Sys ...

  3. Mybatis动态语句部分收集

    where: <select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BL ...

  4. 使用 Zephir 轻松构建 PHP 扩展

    简介: 通过 PHP 扩展, 我们可以在 php 代码中使用一些特定的方法(大部分的 php 扩展都是用 C 写的). 比如,在 PHP 中需要与 SQLite3 交互,我们可以自己写方法与之进行连接 ...

  5. [ISE调试] 在ISE调试过程中,遇到过的warning以及消除办法

    1.在generate的过程中,在Map环节遇到了下面这个warning 意思:告诉你是黑盒子,而且他本来在设计里面就是黑盒子. 解决办法:点击图中的,会弹出一个代码文件,是声明这个IP核的文件,代码 ...

  6. [第二章]了解storm

    1.什么是storm Apache Storm is a free and open source distributed realtime computation system. 免费.开源.分布式 ...

  7. 视频抓取利器you-get

    本文链接:https://github.com/soimort/you-get/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E You-Get 乃一小小哒命令行程序 ...

  8. tomcat-9.0.20缓存空间不足

    问题2:启动时候报这样的警告:警告 [main] org.apache.catalina.webresources.Cache.getResource 无法将位于[/WEB-INF/classes/t ...

  9. Python 并发总结,多线程,多进程,异步IO

    1 测量函数运行时间 import time def profile(func): def wrapper(*args, **kwargs): import time start = time.tim ...

  10. 关于C# 语言

    C# 语法高度重视表达,但学习起来也很简单轻松. 任何熟悉 C.C++ 或 Java 的人都可以立即认出 C# 的大括号语法. 通常情况下,了解上述任何一种语言的开发者可以在很短的时间内就开始使用 C ...