题目: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. day1-习题

    # 1.使用while循环输入 1 2 3 4 5 6 8 9 10 count = 1 while count<11 : #使用while语句循环输入123...10 if count == ...

  2. Machine Learning in Action ---- kNN

    ------------恢复内容开始------------ # -*- coding: utf-8 -*- """ Created on Thu Nov 14 19:2 ...

  3. 开启docker远程访问

    开启docker远程访问 进入到/lib/systemd/system/docker.service vim /lib/systemd/system/docker.service 找到ExecStar ...

  4. C语言1博客作业06

    这个作业属于哪个课程 C语言程序设计II 这个作业的要求在哪里 https://www.cnblogs.com/sanying/p/11771502.html 我在这个课程的目标是 端正态度,认真对待 ...

  5. Google Chrome浏览器的编码格式的修改步骤

    Chrome  Charset插件 大二萌新正在学JavaEE,当学到TomCat时,用到浏览器,但是呢,出现了中文乱码的情况,而又用的是Google,可烦恼了,由于Google Chrome的更新, ...

  6. Redis Geo HyperLogLog类型介绍

    ​Geo类型 Redis3.2.0版本推出 可以将用户给定的地理位置信息存储起来,并对这些信息进行操作 GEOADD key longitude latitude member [longitude ...

  7. 【集合系列】- 深入浅出的分析 WeakHashMap

    一.摘要 在集合系列的第一章,咱们了解到,Map 的实现类有 HashMap.LinkedHashMap.TreeMap.IdentityHashMap.WeakHashMap.Hashtable.P ...

  8. 扛把子组作业要求 20191024-3 互评Alpha阶段作品

    此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/9860] 组名:扛把子 组长:迟俊文 组员:宋晓丽 梁梦瑶 韩昊 刘信鹏 ...

  9. 小程序取消IOS虚拟支付解决方案

    前因 本来我们的小程序用的好好的,结果突然有一天,微信就把小程序的ios端的虚拟支付给关了...坑爹啊!搞的安卓端的可以支付,ios的支付不了.于是就在网上找解决办法. 一说通过app跳转支付,总不能 ...

  10. 来理解undefined 和 null 区别

    之前虽然也知道这两个之间的区别,但是让我描述的话,感觉上还是说的不是很清楚.今天也详细看了一次这个知识点,现在来说说这两者间的区别. null: Null类型,代表“空值”,代表一个空对象指针,使用t ...