nbuoj2784 倒水
题目: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 倒水的更多相关文章
- 广度优先搜索 cdoevs 1226 倒水问题
cdoevs 1226 倒水问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升 ...
- 倒水问题 (codevs 1226) 题解
[问题描述] 有两个无刻度标志的水壶,分别可装x升和y升 ( x,y 为整数且均不大于100)的水.设另有一水缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒.已知x升壶为空壶, ...
- POJ 3414 Pots【bfs模拟倒水问题】
链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...
- yzoi1777倒水问题的详细解法
Description - 问题描述 x.y.z三个容器,其最大容量分别是xMAX升.yMAX升.zMAX升,这里规定100>xMAX>yMAX>zMAX.一开始x是装满了水的,现在 ...
- codevs1226倒水问题(Bfs)
/* 首先建立模型 可以看成是三个水杯 第三个无穷大 (这里看成是201足够了) 最少步数 想到Bfs 维护队列里的状态:要有个步数 还要有v :此时刻三个杯子有多少水 然后倒水:因为没有刻度 所以有 ...
- 倒水问题-->经典面试题目
题目详细: 有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水.我们还有一个足够大的水缸,足够容纳C升水.起初它是空的,我们只能往水缸里倒入水,而不能倒出.可以进行的操作是:把一个容器灌满 ...
- 倒水问题 (FillUVa 10603) 隐式图
题意:本题的题意是给你三个杯子,第一二个杯子是空的,第三个杯子装满水,要求是量出一定容量d升的水.若是得不到d升的水,那就让某一个杯子里面的水达到d',使得d'尽量接近d升. 解题思路:本题是给出初始 ...
- uva10603 倒水问题
状态搜索.类似八数码问题 AC代码 #include<cstdio> #include<queue> #include<cstring> #include<a ...
- 美团codeM预赛A轮 倒水
[编程题] 倒水 时间限制:1秒 空间限制:32768K 有一个大水缸,里面水的温度为T单位,体积为C升.另有n杯水(假设每个杯子的容量是无限的),每杯水的温度为t[i]单位,体积为c[i]升. 现在 ...
随机推荐
- Vue的指令以及组件化开发
一. 自定义指令 如何: 1. 创建指令 Vue.directive("指令名",{ inserted(elem){//指令所在的元素被加载到DOM树上后自动执行指令 //elem ...
- jsp+servlet分页查询
分页查询 减少服务器内存开销 提高用户体验 效果图 思绪图 分页显示Bean文件代码 package cn.ytmj.findlist.domain; import java.util.List; / ...
- 深入理解计算机系统 第九章 虚拟内存 Part1 第二遍
这次花了4小时40分钟,看了第 559~575 页,共 17 页 第一遍对应地址 https://www.cnblogs.com/stone94/p/10264044.html 注意:本章的练习题一定 ...
- My First Cloud Application's Design
Structure Diagram as following: Questions list: 1. Skydrive Integration > Based on the MSDN commu ...
- PHP实现日历签到,并实现累计积分功能
在网站开发过程中我们会经常用到签到功能来奖励用户积分,或者做一些其他活动.这次项目开发过程中做了日历签到,因为没有经验所有走了很多弯路,再次记录过程和步骤. 1.日历签到样式:使用的是calendar ...
- 用大写字母输入 Linux 命令,实现以 sudo 用户权限运行
我们知道,一些 Linux 命令是要通过 sudo 权限才能运行的,这需要我们每次使用这些命令时在前面加一个 sudo ,十分繁琐.今天给大家介绍一个好用的工具 SUDO ,它只需要我们用大写字母键入 ...
- idea2017建立jsp工程及tomcat等配置
1:建立工程,选择Java Enterprise,可能需要选择tomcat路径和jdk路径: =============================== 以下作为第二种方式参考: 1:创建新工程 ...
- 微擎使用post提交,并显示弹出层
微擎使用post提交,并显示弹出层 function changeStatus(id, status) { // 提交数据 var id = parseInt(id); var status = pa ...
- nyoj 73-比大小 (Java, 高精度)
73-比大小 内存限制:64MB 时间限制:3000ms 特判: No 通过数:15 提交数:64 难度:3 题目描述: 给你两个很大的数,你能不能判断出他们两个数的大小呢? 比如1234567891 ...
- HTML建立超链接
链接是HTML文档的最基本特征之一.超文本链接英文名为hyperlink,它能够让浏览器在各个独立的页面之间方便地跳转.超链接有外部链接.电子邮件链接.锚点链接等. a标签 网页中<a& ...