枚举--称假币

问题描述:赛利有 12 枚银币。其中有11 枚真币和1 枚假币。假币看起来和真币没有区别,但是重量不同。但赛利不知道假币比真币轻还是重。于是他向朋友借了一架天平。朋友希望赛利称三次就能找出假币并且确定假币是轻是重。例如:如果赛利用天平称两枚硬币,发现天平平衡,说明两枚都是真的。如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币。经过精心安排每次的称量,赛利保证在称三次后确定假币。

解法描述

如果已知不标准的硬币是轻还是重,那么很简单,直接分3组,称第一二组确定出硬币在哪组,然后再组内对半称,最后再对半称。但此时不知是轻是重,这个方法不可行。

(1)、这里轻重未知,在每次称量时,应该尽量利用上次称量出的轻重关系。为了便于叙述,讲12个硬币标记为1、2、...12。先称量1+2+3+4和5+6+7+8:

如果相等,那么假币在9、10、11、12中。此时已知1~8是真币,可以作为标准来判断,那么使用1+10和2+12比较,如果相同则假币在9和11中,9和1称来判断假币是9还是11;否则用1和10来称一次判断假币是10还是12。

(2)、如果不等,假设1+2+3+4>5+6+7+8(反之类似),此时9、10、11、12是真币。那么将1、2、3去掉换成5、6、7,再在右边加上标准的9、10、11,形成5+6+7+4和9+10+11+8比较。

如果相等,假币只可能在1、2、3中,并且由第一次称量的结果,假币比真币重。从1、2、3中选择2个,若平衡,则剩余一个为假币,不平衡时重的那个是假币。

如果5+6+7+4<9+10+11+8,只可能因为轻的假币来到了左边。那么就在5、6、7中判断那个轻的假币,和上面类似。

如果5+6+7+4>9+10+11+8,5、6、7必然都不是假币,那么只用判断4和8哪个是假币。使用1枚真币和4称量即可判断。

  扩展一下,可以发现这个方法也能判断13枚的情况:先分成12枚和1枚,如果假币在12枚中,分析同上;如果假币是那分出来的1枚,上面第一种相等的情况每次都是相等,判断完三次就可得出结论:假币不在12枚中,只能是那额外的1枚。

 

解法参考:http://www.cnblogs.com/wuyuegb2312 

 

 

 

### 枚举假币检测算法 在编程领域,枚举是一种常见的技术,用于遍历集合中的所有可能情况。对于涉及 **Counterfeit Dollar** 的问题,通常可以将其建模为一种搜索或优化问题,在一组硬币中找到唯一的一枚假币。 #### 使用枚举解决问题的方法 通过枚举方法来解决此类问题的核心在于穷尽所有的可能性并验证每种设的有效性。例如,可以通过比较两组硬币量差异来判断哪一枚假币[^1]。 以下是基于 Python 实现的一个简单例子: ```python def find_counterfeit(coins, compare): """ 找到假币的位置。 参数: coins (list): 表示硬币列表,其中索引代表位置。 compare (function): 接受两个子集作为参数,并返回 -1、0 或 1, 表明左侧较(-1),相等(0)或者右侧较(1)。 返回: int: 假币所在的索引位置。 """ left = 0 right = len(coins) - 1 while left <= right: mid = (left + right) // 2 # 将硬币分为两部分进行对比 result = compare(coins[left:mid], coins[mid:right]) if result == 0 and len(coins[left:mid]) == 0: return mid # 如果分组均无差异,则当前中间值即为假币 elif result == -1: right = mid - 1 # 左侧更,说明假币位于左半部分 else: left = mid + 1 # 右侧更,说明假币位于右半部分 return -1 # 若未发现任何异常则返回 -1 ``` 上述代码实现了一个二分查找逻辑,利用 `compare` 函数逐步缩小范围直到定位唯一的假币[^2]。 #### 复杂度分析 该算法的时间复杂度主要取决于每次分割操作的数量级以及调用 `compare` 方法的成本。如果采用经典的二分法策略,则时间复杂度接近于 \(O(\log n)\)[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值