原题:
http://acm.fzu.edu.cn/problem.php?pid=1003
分析:
经典的题目(大部分版本是区分苹果).这题最关键的就是充分挖掘每次称得的结果所提供的信息.
这题使用了一个包含12个元素的整型数组,用来标记对应的硬币的状态.
* 未知标记为2
* 正常标记为0
* 可能轻标记为-1
* 可能重标记为1.
下面结合称出的结果说明解题方法:
1) 平衡 : 既然是平衡,那么天平上的硬币就都是正常的.那就都标记为0,且不再改变(标记为0,就确定是正常的).
2)右边高: 可能一个重的假硬币在左边,也可能一个轻的假硬币在右边.这要分情况讨论.
* 被称的硬币是"未知"状态: 在左边就标记为重,在右边就标记为轻.
* 被称的硬币已经被标记为"可能为重":在左边的不改变状态.在右边的标记为正常.(先是"可能为重",后又"可能为轻",那么就是正常的)
* 被称的硬币已经被标记为"可能为轻":在左边的标记为正常.在右边就不改变状态.
一次不平衡的结果还隐藏着,不再天平上的硬币都是"正常"的信息.所以,标记此次没称的硬币为"正常".
3) 右边低: 与"2) 右边高" 同理.
伪代码:
MARK-LIGHT-COINS(arr[], len)
1 for i ← 1 to len
2 do if current coin state is "Heavy"
3 then change current coin state to "True"
4 if current coin state is "Unknow"
5 then change current coin state to "Light"
源码:(VC++)
本文介绍了一种通过三次称重来找出一枚假硬币并判断其轻重的算法。使用了12个元素的整型数组标记硬币状态,通过平衡、左右不平衡等称重结果更新状态,最终确定假硬币。
1584

被折叠的 条评论
为什么被折叠?



