贴子 八硬币问题 引申的算法问题.

dfasri 2012-06-18 10:16:59
这个问题本身不难, 答案也好就给出. 但我想说的不是答案是否给出, 而是看到某些人的回复, 所描述的过程根本就不是算法.

我们是要把算法实现在计算机里面的, 不是用人为的随意去比较然后得出结果, 所以描述的过程, 必须要符合计算机能理解, 能动作的过程来描述. 人眼一下就可解的题目, 用计算机语言把过程有规律的, 可实现的描述出来, 才是一种有效算法. 乱来分N堆, 然后说句先比较什么再比较什么, 这种不是一种算法, 是人类的解题过程而已.

换句话是指:算法不单单是为了解决问题, 得出答案, 而更需要的是能够用计算机编写出一个过程来解决类似的问题, 有规律的, 有规则的, 不定量的, 假如是量身订造, 解得了120个币, 解不了60个币, 这样叫算法么?

以下就是一个自认为正确的算法描述过程, 计算机能理解, 代码好写, 能够简单的写成一个循环来解决:
一直都采用三等份的原则, 假如不能平分的, 剩下的那么合在一起, 能平分的就平分. 每次比较, 只比较数量相等的部分, 按这种规律走
第一次 120 分 40, 40, 40, 比较任意两个后得到 40
第二次 40 分 13, 13, 14, 比较前两个13后, 得到 13 或 14, 因为题目是最差情况, 所以选择 14
第三次 14 分 4, 4, 6, 比较前两个4后, 得到 4 或 6, 因为题目是最差情况, 所以选择 6
第四次 6 分 2, 2, 2, 比较任意两个后得到 2
第五次 2 分 1, 1, 0, 得出结果.

算法不是解决特定的问题, 而是从特定的问题找出规律, 解决类似的问题才叫算法.
...全文
382 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
dfasri 2012-06-25
  • 打赏
  • 举报
回复
要答案的话也有, 这个是其中一种情况的答案:
120首先分成 40 40 40
天秤平衡时 得到 40, 轻重未知 1次
分 13, 13, 13, 1
平衡时, 得到 14, 轻重未知 2次
4, 4, 4, 2
平衡时, 得到6, 轻重未知 3次
2, 2, 2
平衡时, 剩下2, 轻重未知 4次
题目变成:
已确认1, 2, 3, 4, 5, 6号球, 其中1234是正常的球,
5,6号球有一个正常球, 一个未正常的球, 未知不正常的球是轻是重.
那么就简单的: 拿1号球跟5号球比较, 平衡时, 6号球就是坏球, 否则, 5号球就是坏球. 5次比较
dfasri 2012-06-25
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]

第一次秤量 就是非平衡情况 (不知道坏球轻重),请问 你 是如何 得到的 40个球啊。应该是80个啊 。
[/Quote]

我并没有看清题目, 没看到坏球轻重之分. 假如坏球没有分轻重, 这种方式是会比较多一次的, 要6次比较才有结果.
这个贴不是解答题目的, 而只是说, 解答这类问题其实没有什么用, 答得上答不上其实不代表什么, 这类题目只会花无谓的时间而已.

说白了, 这类题目所运用的要点就是:
1. 分辨的结果是一次可以识别三个的.
2. 数学的关系运算要加入. 但这种关系运算只适用于本题目, 题目范围以外的情况, 不适用.
AnswerLJ 2012-06-21
  • 打赏
  • 举报
回复
第一次秤量 就是非平衡情况 (不知道坏球轻重),请问 你 是如何 得到的 40个球啊。应该是80个啊 。

这种问题 本来就没有自顶向下的规律可循,只能 推理出
最终一次秤量的时候,在不知轻重的情况下 最多可以从三个球中确定出坏的 是哪个。
以12球来说,最终的目标都是在倒数第二次秤量之前将其未确定的球的个数控制在三个或者三个以内。然后以此为根据往上进行推导啊。这个问题本来就 是需要从最后往上推导的啊。
你这直接从开始推,明显不 符合 认知事物的 逻辑规律啊


nice_cxf 2012-06-19
  • 打赏
  • 举报
回复
在120枚外观相同的硬币中,有一枚是假币,并且已知假币和真币的重量不同,但不知道假币与真币相比较轻还是重,可以通过一架天平来任意比较两组硬币,最坏情况下,能不能之比较5次就检测出这枚硬币
====================================
这是原贴写的,120个球,每一个都有可能偏轻或偏重,难道不是240种情况?
题目都没读清楚,还在这里谈什么算法
dfasri 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

连题目都没搞清楚还谈算法。。。
在不知道轻重的情况下,2次是不可能区分6个的,说了你那个算法5次根本不行,前提都不对,程序能对么?
要求给定120个球的240种情况,对其中任何一种情况,你那个程序能输出正确结果么?
[/Quote]

再说, 你是不是有点错乱了, 在不知道轻重的情况下, 还能够找到那个重量不正确的硬币么? 而且你这问题..没人知道你在说什么...还是放弃程序员之路吧..
dfasri 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

连题目都没搞清楚还谈算法。。。
在不知道轻重的情况下,2次是不可能区分6个的,说了你那个算法5次根本不行,前提都不对,程序能对么?
要求给定120个球的240种情况,对其中任何一种情况,你那个程序能输出正确结果么?
[/Quote]

你继续钻你的牛角尖吧. 只要你认为你正确的方式, 能够用计算机语言实现就是了. 算法跟业务流程不一样, 用流程的方式来解答算法的过程是错误的答案, 哪怕你得出的结果是正确也好.
dfasri 2012-06-19
  • 打赏
  • 举报
回复
我很难明白为何国人总喜欢这类投机取巧来解决问题的方式, 到底是谁把这"投机取巧"的东西带入到国人思维里面还根深蒂固.
'投机取巧' 说好听点, 是解决了问题. 说难听点, 叫'治标不治本'. 老在这'治标'的问题花时间, 不在治本上面下功夫. 还居然在招人上面拿这类题目出来整人...一点意义都没有.
这也难怪国内的程序总是千奇百怪的编写方式都出来, 没有一份软件的生命周期能够生存长久, 都是兴起了又没落了. 也难怪国内总是没有好的算法出来, 都是买国外的算法, 要么就是用国外的算法.
唉, 悲哀.
nice_cxf, 从你的语气来说, 我的水平比你差得多, 没关系. 但还是奉劝一句: 别着迷这类无谓的解题了, 这类解题所教你的东西, 解开其他典型题目也能够学习到的, 没有必要花时间精力在这类'投机取巧'上面.
dfasri 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

会解这题本来就没啥,但是你根本不会解,却在那里说什么这个算法好那个算法不好不是扯淡么?
你自己都不知道怎么解,机器就能知道?
[/Quote]

当然, 你认为解开这类题目对你的提高有莫大帮助, 或者说解不了这题就自认为水平很为低也行.
我只想提醒下一去钻这些题目的人, 钻得再深也没多少用处, 算法讲究的东西跟解题讲究的东西不一样. 出这类题目的人就像是考你脑筋急转弯的, 大部分都是没用的扯谈, 但不否认小部分是有价值的.

而这类题目, 就是无价值的类型. 算法效率的结论, 你解开这么多题这类题, 或者得出这些题目的答案, 你得到会什么? 得到了怎样写好算法的结论没? 得到怎样设计算法没? 得到怎样思考算法没?

我再重申一次, 做这类算法题, 不能够采用 为解题而解题的过程, 而必须采用 为解题而造算法的过程 才能够提高编程水平. 解题能力别跟编程能力自己挂上钩了.
dfasri 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

会解这题本来就没啥,但是你根本不会解,却在那里说什么这个算法好那个算法不好不是扯淡么?
你自己都不知道怎么解,机器就能知道?
[/Quote]

那你研究这题目, 得到的是什么结论? 解开了这类专用题目你得到的是什么?
nice_cxf 2012-06-19
  • 打赏
  • 举报
回复
会解这题本来就没啥,但是你根本不会解,却在那里说什么这个算法好那个算法不好不是扯淡么?
你自己都不知道怎么解,机器就能知道?
dfasri 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
如不平,假定1234>5678(1234<5678同理),那么125vs346,平则7对8,那边轻那个就是问题球且轻,如125重(轻同理)1vs2,平则6轻,否则那边重那边就是问题球且重
[/Quote]

这是解题了. 怎样让它成为算法? 你描述的是人类的解题过程, 计算机的解题过程怎样做? 当球增加的时候怎样做? 12345678, 把78拿出来是有规律的么? 把1234 56 分解成 125, 346, 也是有规律的么? 我强调的是规律, 算法不是解决单一问题用的.
这里你是用编号和归类的人类思维来考虑得出结果. 计算机上怎样实现? 假如是相同的问题, 120的球应该也可以用这种办法来解决的, 怎么做?
40 40 40 比较, 然后得到80后, 再怎么做? 30, 30, 20, 再剩下 60, 然后怎么做?

我发贴了的原因是什么你不明白, 我为的不是说解出某道题很厉害呢. 我是指 算法 跟 解题不同, 别老钻着把题目解开以为自己很了不起, 要把题目用计算的思维解开, 并且能够适用于类似情况, 得出较好的效率, 这才叫算法! 别钻牛角尖了, 老兄. 平分3 的算法在类似题目里面兼容性和性能都是最平均的. 考虑这些题目完全是浪费时间.
带上编号去解题可行, 我也知道必须要用编号而不能够用集合来解决, 但问题是这种解题不能够称为算法.
nice_cxf 2012-06-19
  • 打赏
  • 举报
回复
原来12球3次你都不会。。。
算了给你过程把:
1234vs5678
如不平,假定1234>5678(1234<5678同理),那么125vs346,平则7对8,那边轻那个就是问题球且轻,如125重(轻同理)1vs2,平则6轻,否则那边重那边就是问题球且重
如1234=5678,9,10vs11,1,如左边重(右边重同理),9vs10,如平,则11轻,如不平,则重那边是问题球且重,如果还是平说明12好是问题球,12vs11结束
dfasri 2012-06-19
  • 打赏
  • 举报
回复
当然还存在另一种解决思维, 像小白鼠试药的那种二进制的模式, 把小白鼠按二进制的来排列组合, 不停的试药来定位毒药位置.

但很可惜的是, 这种办法根本走不通, 不知道谁是真假的情况下, 肯定要通过三等分, 找出重量不相同之外, 还要找出是较重的假的, 还是较轻的假的.
nice_cxf 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 12 楼 的回复:

井底之蛙,你自己没办法用5次称出不代表实际5次不能不行,实际上这题目写代码本身就很复杂,12球3次的曾有人用3进制的办法写程序求出,这个实际上也是一样的可以用3进制,就是麻烦许多而已


那你也可以描述你认为的3进制的方式, 试试把它写成有效的算法啊. 我这里说的是 乱描述, 没规律的过程, 不是一个有效的算法过程. 仅此而已, 没有拿题目本身说什么.
……
[/Quote]
就算我用了一个很滥的算法,但是我满足了题目5次的要求,一样是正确的,当然有更好的算法。
你的算法再好,不能满足5次解决问题,一样是错的,不是说只有写起来简单容易懂的才是好的算法,满足题目要求才是第一位的,连题目要求都达不到还谈什么算法好坏
dfasri 2012-06-19
  • 打赏
  • 举报
回复
顺带一下, 你所谓的12球3次, 只需要很简单的说出重点来:
1. 有办法比较一次就得知假球是较重还是较轻吗? 没有办法, 必须分成三份以上, 起码比较两次, 才能够得到较轻还是轻重的一方是假球, 这是固定的, 想都不用想.

剩下的就是如何实现用1次比较得到4个球当中哪个是假的, 你认为可能么?

在最优的情况下, 可以实现. 但在最差的情况下, 要多一次比较. 你认为你崇拜的3进制可解决的话, 我倒是想知道有什么算法可以推翻这个现实最可能的操作. 如何在你的比较过程里面, 在一开始不说明假球是轻是重的情况下, 通过一次判断就得到自己留下来继续解释的, 是有假球存在的.

然后再有什么办法, 通过一次天秤, 就能从4个球里面找到较轻或较重的球, 还百分百命中.

这是现实最有可能的理论. 你有好办法能够使用一开始运算时, 一次比较就得到假球?
dfasri 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

井底之蛙,你自己没办法用5次称出不代表实际5次不能不行,实际上这题目写代码本身就很复杂,12球3次的曾有人用3进制的办法写程序求出,这个实际上也是一样的可以用3进制,就是麻烦许多而已
[/Quote]

那你也可以描述你认为的3进制的方式, 试试把它写成有效的算法啊. 我这里说的是 乱描述, 没规律的过程, 不是一个有效的算法过程. 仅此而已, 没有拿题目本身说什么.
我描述的过程的确是一种算法, 只是这种算法不能够解答题目.

但我看到更多的是不能够称上算法的描述来解答这题目. 而且, 除非有办法让天秤笔法一次能够辨别4个, 而不是3个, 否则这题不可能存在合理的算法描述, 只有人为的解答过程可言. 仅此而已.

你只为钻题目, 而根本不考虑算法的本质, 让你解答出来又怎样?
nice_cxf 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 10 楼 的回复:

在120枚外观相同的硬币中,有一枚是假币,并且已知假币和真币的重量不同,但不知道假币与真币相比较轻还是重,可以通过一架天平来任意比较两组硬币,最坏情况下,能不能之比较5次就检测出这枚硬币
====================================
这是原贴写的,120个球,每一个都有可能偏轻或偏重,难道不是240种情况?
题目都没读清楚,还在……
[/Quote]
井底之蛙,你自己没办法用5次称出不代表实际5次不能不行,实际上这题目写代码本身就很复杂,12球3次的曾有人用3进制的办法写程序求出,这个实际上也是一样的可以用3进制,就是麻烦许多而已
dfasri 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

在120枚外观相同的硬币中,有一枚是假币,并且已知假币和真币的重量不同,但不知道假币与真币相比较轻还是重,可以通过一架天平来任意比较两组硬币,最坏情况下,能不能之比较5次就检测出这枚硬币
====================================
这是原贴写的,120个球,每一个都有可能偏轻或偏重,难道不是240种情况?
题目都没读清楚,还在这里谈什么算法
[/Quote]

题目答案那么简单, 就不是直接写个不行就可以了么? 你以为人家出题目单纯就只要得出解答么? 你能够用别的更好的办法来解出这个答案么? 什么乱七八糟的分5组, 先拿两组比较等之类的方案可行么? 除了对应这个120之外还可行么? 什么是最坏情况? 为何人家会这样问? 多想想问题想要得到的本质答案. 唉, 就你这种的头脑还可以编程么?
nice_cxf 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:

算法至少能达到所要求的最少次数,别人要求5次,你用了6次,因此你这个算法根本就不对,所以就算你转成程序有用么?
还是那句话:12球3次的过程如果你都不清楚的话,就别写你所谓的算法了

你明白为何出题目会是 12 跟 3吗? 为何不是12 对 2呢? 12 对 4, 对5呢?
[/Quote]
因为12是3次能达到的最大,就像这个为啥是120个5次,因为5次最多120,连这些都不清楚的话还想找什么算法
dfasri 2012-06-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

算法至少能达到所要求的最少次数,别人要求5次,你用了6次,因此你这个算法根本就不对,所以就算你转成程序有用么?
还是那句话:12球3次的过程如果你都不清楚的话,就别写你所谓的算法了
[/Quote]
你明白为何出题目会是 12 跟 3吗? 为何不是12 对 2呢? 12 对 4, 对5呢?
加载更多回复(5)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧