FOJ 1003 Counterfeit Dollar

本文介绍了一种通过三次称重来找出一枚假硬币并判断其轻重的算法。使用了12个元素的整型数组标记硬币状态,通过平衡、左右不平衡等称重结果更新状态,最终确定假硬币。

原题:

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

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值