今天笔试遇到了一道题目 天平左边有一个重量为x的物体,还有1,3,9....3^n这n+1个砝码,问怎么将砝码放到天平两边使得平衡
每个砝码只有一个,有的可以不用
开始给了一个具体的x让算,那样具体一点还好算,后来给的x,不定量的砝码,想用递归,回溯,但是感觉很难写
后来想到砝码都是3的整数次幂,想能不能用三进制去做,结果证明果然有效
具体思路如下
将x转化成三进制放到数组a[N],将所有的砝码放到数组b[M]中
从低往高一次比较对应位的数值,三进制肯定只有0,1,2三种情况,因为有些砝码可能要放到左边,所以左边还要加上相应的砝码,可能产生进位,于是设进位标识为takeover
这样三个数字加上是否进位,总共六种情况
因为b数组都为1
当a[i]==0&&takeover=false
也就是没有进位的时候,此时要保证该位相等需要将右边的这个权值的砝码拿掉,也就是将b[j]=0
当a[i]==0&&takeover=true
也就是有进位的时候,此时不变
当a[i]==1&&takeover=false 也不需要改变
当a[i]==1&&takeover=true 此时a[i]=2,将b[j]对应的那个砝码给a,那么a[i]=0, b[j]=0, takeover=true
当a[i]==2&&takeover=false 同上,也是b[j]对应的那个砝码给a,那么a[i]=0, b[j]=0, takeover=true
当a[i]==2&&takeover=true 此时a[i]=0, 将b中对应砝码去掉即可,也就是b[j]=0
当某个数组先结束时,此过程退出,如果a先结束,那么对应b的高位权值的砝码都不用加了,如果b先结束,说明x重量超过所有砝码的重量,即使加上前面去掉的那些,也无济于事。