yinyin 笔试题

来源:互联网 发布:免费程序化交易软件 编辑:程序博客网 时间:2024/05/01 03:45

今天笔试遇到了一道题目 天平左边有一个重量为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重量超过所有砝码的重量,即使加上前面去掉的那些,也无济于事。

 

原创粉丝点击