作业帮 > 综合 > 作业

编程题 倒水1.倒水 【题目描述】 一天,天天买了 N 个容量可以认为是无限大的瓶子,初始时每个瓶子里有 1升水.天天发

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/06/16 00:51:32
编程题 倒水
1.倒水
【题目描述】
一天,天天买了 N 个容量可以认为是无限大的瓶子,初始时每个瓶子里有
1升水.天天发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选
择两个当前含水量相同的瓶子合并,把一个瓶子的水全部倒进另一个瓶,然后把
空瓶丢弃(不能丢弃有水的瓶子).
显然在某些情况下天天无法达到目标,比如N=3,K=1.此时天天会重新买
一些新的瓶子(新瓶子的容量无限,开始时有1升水),以达到目标.
现在天天想知道,最少需要买多少新瓶子才能达到目标?
【输入文件】
一行两个正整数N,K(1
用位操作最为方便.首先问题核心思想是,每2^n个瓶子可以最终合并保留1个瓶子(一颗满二叉树),本题就变为N能写成最少多少项2的n次方的和的形式,有多少项就会最终剩多少瓶,要添加的瓶子数量就是要减少之前多项式的项数.比如198 = 128+64+4+2,尽可能合并后最终会剩4瓶.若最后需要保留3瓶,则只需加2,变成128+64+8.
用位操作,198二进制为1100 0110,里面有4个1.要保留3瓶,就是要找出一个含有3个1的二进制数,这个数应该是最小的大于198的数,即1100 1000.我们可以看出问题可以简化为从高往低第k位需要多少来进位:0110需要多少才能变成1000
代码:
public int compute2s(int num,int k){
int moved = 0;
int ones = 0;
while(ones < k){
if((num&0x40000000)!=0){
ones++;
if(ones == k)
break;
num -= 0x40000000;
}
num moved;
int upBond = 1;
while(upBond
说有两个瓶子一个是5升的 一个是4升的.往瓶子里倒水时必须把瓶子倒满 3升水 说有两个瓶子一个是5升的 一个是3升的.往瓶子里倒水时必须把瓶子倒满 问怎样把5升的瓶子装上4升的水 装水的圆柱形瓶子,向瓶子内倒水,重心最低时,求水质量,高度? 把5升水倒入容量是300毫升的瓶子里,最多能倒满这样的瓶子()瓶 向盛二氧化碳的塑料瓶中倒水,瓶子变瘪,证明有二氧化碳 把6升饮料平均装在5个瓶子里,每个瓶子的饮料是6升的( ),每个瓶子的饮料有( )升. 关于仓鼠饮水器的问题今天刚买了一个鼠笼,上面有一个真空饮水器,就是一个瓶子连着一个带胶塞的吸管,不知道怎么倒水进去,难道 一道四年级应用题,急一天,天天的妈妈买了600粒糖.回到家,妈妈要考考天天:“天天,现在你把糖放在9个盒子里,但是,要在 倒水时水有时不会直接留下来,而会沿着瓶子流,这样往往会在倒水是倒出杯子.为什么会出现这种现象 如果你将一个装满水的瓶子反过来倒水,而瓶口的宽度比瓶身窄,会出现一个个气泡升里瓶子里,为什么? 5个瓶子里装有同样多的水,如果从每个瓶子里倒出3kg,这样5个瓶子里剩下的水名总量正好是原来3瓶水的总量.每个瓶里原来有 (生活题)用一个杯子向一个空瓶里倒水,如果倒进了3杯水,连瓶子共重870克,如果倒进5杯水,连瓶子1110克,一杯水和一