问题:编程题倒水1.倒水【题目描述】一天,天天买了N个容量可以认为是无限大的瓶子,初始时每个瓶子里有1升水.天天发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前
答案:↓↓↓ 蔡海鹏的回答: 网友采纳 用位操作最为方便.首先问题核心思想是,每2^n个瓶子可以最终合并保留1个瓶子(一颗满二叉树),本题就变为N能写成最少多少项2的n次方的和的形式,有多少项就会最终剩多少瓶,要添加的瓶子数量就是要减少之前多项式的项数.比如198=128+64+4+2,尽可能合并后最终会剩4瓶.若最后需要保留3瓶,则只需加2,变成128+64+8. 用位操作,198二进制为11000110,里面有4个1.要保留3瓶,就是要找出一个含有3个1的二进制数,这个数应该是最小的大于198的数,即11001000.我们可以看出问题可以简化为从高往低第k位需要多少来进位:0110需要多少才能变成1000 代码: publicintcompute2s(intnum,intk){ intmoved=0; intones=0; while(ones |