鱼C论坛

 找回密码
 立即注册
查看: 5950|回复: 33

[技术交流] 小练习20160201:称量乒乓球

[复制链接]
发表于 2016-2-1 22:36:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2016-2-19 08:09 编辑

记得有个小游戏,称量乒乓球。有多个乒乓球,除了一个球更重外,其他球重量一样,怎样用天平最少的称量次数找出重球。

这次要求主要功能编写成一个函数,问题的关键是怎样分球去称量。为了让大家春节快快乐乐,这次出题比较简单,只要答对都给予加分奖励。

考虑到大家春节期间事情比较多,结束时间定在 2016-2-17 23:59

具体要求如下:

  1. def find(num1, num2, output = False):
  2.     #将主要功能封装成一个函数。
  3.     #其中num1为总的乒乓球数,num2为重球在第几个。
  4.     #output为True时输出称量过程,为False时不显示过程。
  5.     #过程示例如下:
  6.    
  7.     #以27个乒乓球,重球在第25个为例。
  8.     #1次称量1-9球和10-18球,重量相同。
  9.     #2次称量19-21和22-24求,重量相同。
  10.     #3次称量25球和26球,25球重,重球为25球。
  11.     #共计称量3次。
  12.     ....
  13.     ....
  14.     return times#返回称量次数。

  15. n = random.randint(1, 100)#重球在1~100之间
  16. find(100, n, output = True)#调用find函数一次显示称量过程
  17. #计时开始
  18. for i in range(100000):#做100000次测试
  19.     n = random.randint(1, 100)
  20.     times = find(100, n)#调用find函数不显示称量过程
  21. #计数结束
  22. #输出平均几次称出重球
  23. #输出用时
复制代码
有鱼油问:题目还有点不理解,是知道重球的位置去找出最少次数,还是不知道重球的位置要确定它在哪?解释一下:重球的位置是随机的,需要用最少的称量次数找出来。以3个球为例,将1、2球放在天平的左右两个盘中,如果左重,则重球是1号球,如果右重,则重球是2号球,如果一样重,则重球是3号球。


评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
~风介~ + 5 + 5 + 5 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-3-21 11:59:08 | 显示全部楼层
挖坟挖坟
  1. def 称重(数组):
  2.     数组长度=len(数组)
  3.     长三分=数组长度//3
  4.     长余留=数组长度%3
  5.     数组1=数组[0:长三分]
  6.     数组2=数组[长三分:长三分*2]
  7.     数组3=数组[长三分*2:长三分*3]
  8.     if sum(数组1)>sum(数组2):
  9.         return 称重(数组1)   
  10.     elif sum(数组1)<sum(数组2):
  11.         return 称重(数组2)+长三分
  12.     elif sum(数组1)<sum(数组3):
  13.         return 称重(数组3)+长三分*2
  14.     elif 数组[数组长度-1]<数组[数组长度-2]:
  15.         return 数组长度-1
  16.     else:
  17.         return 数组长度

  18. def 生成(长度):
  19.     import random
  20.     a=[]
  21.     b=random.randint(0,长度-1)
  22.     for i in range(长度):
  23.         a.append(1)
  24.     a[b]+=1
  25.     return a
  26. print(称重(生成(30)))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-24 09:17:35 | 显示全部楼层
学习学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-5 21:54:10 | 显示全部楼层
新人留名~ mark
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-5 14:30:12 | 显示全部楼层

回帖奖励 +3 鱼币

学习,,
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-3-2 07:58:18 | 显示全部楼层

回帖奖励 +3 鱼币


加油
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-23 11:50:18 | 显示全部楼层
666666666666666666666666666666厉害
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-23 10:22:27 | 显示全部楼层

回帖奖励 +3 鱼币

抢占位置
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-19 16:17:51 | 显示全部楼层
错过了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-19 12:19:51 | 显示全部楼层
wei_Y 发表于 2016-2-5 13:36
写完才发现二分法是次优解,占坑待编辑。

在函数里生成随机数,赞~
答案很精炼~不愧是版主~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-17 16:48:29 | 显示全部楼层

回帖奖励 +3 鱼币

最近有事情,先拿了鱼币以后再来支持活动吧~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-15 23:15:12 | 显示全部楼层
@DingRan 哦哦~ 受教了,严谨的分析对编程来讲很重要,哈哈~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-15 22:53:43 | 显示全部楼层
本帖最后由 DingRan 于 2016-2-15 22:59 编辑

@zooo 谢谢哈哈~后面的最优算法写的仓促了,确实说的不是很清楚诶~地板除比round更优只是一个个例:当T==100时,地板除优于round,当T!=100时就未必啦~比如T==92时,round恰好是最优算法,地板除则不是。总之,地板除或者“屋顶除”或者round本身跟最优算法没什么关系,只是有时候碰巧和最优算法相等。有时候这三个都不是最优算法,比如T==18时,明明可以整除,最优算法却是5或者7。T==100时,27,28,29,31,32,33,35,36,37都是最优。最优算法这东西很诡异呐~

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2016-2-15 17:28:22 | 显示全部楼层

回帖奖励 +3 鱼币

提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-15 17:05:54 | 显示全部楼层
本帖最后由 zooo 于 2016-2-15 18:05 编辑

@DingRan 先赞下,高数666666~,但还没太理解你所说最优算法,数学知识都还给老师了,,而且我试了几次 '平均三分法' 找球的次数在4.27次附近呀
进行100000轮找重球所用的时间为 4.858,平均4.271次可以找出重球
输入一个字符结束
>>> ================================ RESTART ================================
进行100000轮找重球所用的时间为 5.041,平均4.269次可以找出重球
输入一个字符结束
----------------------------------- -----------------------------------------
突然发现是我的计数器少算了一次,尴尬了
刚刚改好了,找球次数是不会低于4.3次
你试试用地板除代替round,这种简单粗暴的方式好像比用round()找球的次数少,我也不知道为什么
triVer = (end-beg)//3
#triVer = round((end - beg)/3)#分片长度
-----------------------------------------------
使用地板除的测试结果
第一次:进行100000轮找重球所用的时间为 4.968,平均4.310次可以找出重球
第二次:进行100000轮找重球所用的时间为 4.883,平均4.311次可以找出重球
使用round()测试结果
第一次:进行100000轮找重球所用的时间为 6.379,平均4.401次可以找出重球
第二次:进行100000轮找重球所用的时间为 6.389,平均4.402次可以找出重球
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-15 10:23:25 | 显示全部楼层
好像之前见过  让我想一想
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-15 07:52:25 | 显示全部楼层

回帖奖励 +3 鱼币

恩,先研究研究再说
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-14 19:55:59 | 显示全部楼层

回帖奖励 +3 鱼币

分奇数偶数,分两堆称,对重的那堆循环操作
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-11 12:23:54 | 显示全部楼层

回帖奖励 +3 鱼币

研究研究
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-11 00:23:11 | 显示全部楼层
@DingRan 的这个思路有点意思啊!值得思考,再占坑。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-2 06:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表