FOJ 1003 Counterfeit Dollar

来源:互联网 发布:医疗投资集团 知乎 编辑:程序博客网 时间:2024/04/27 06:31

原题:

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++)

原创粉丝点击