华为的面试题13个球,有一个重量与其他12不一样,如何称三次找出该球。答案是什么?请回答!!!

wangwang78 2001-09-12 05:41:34
...全文
2190 101 打赏 收藏 转发到动态 举报
写回复
用AI写文章
101 条回复
切换为时间正序
请发表友善的回复…
发表回复
ninenine 2002-03-31
  • 打赏
  • 举报
回复
直接分治就行了吧?
huahao0672 2002-03-31
  • 打赏
  • 举报
回复
#include <stdio.h>



#include <stdlib.h>



#include <time.h>



#include <math.h>





float sum(int i,int j,float a[]);



int find(float m,float n,int end,int st1,int st2);





main()



{float a[14],m,n,weight_rand;



int i,st1=1,st2=7,step=6,find_rand,end=13,keep_rand;



randomize();



for(i=1;i<14;i++) a[i]=5;



keep=random(13)+1;



/*通过随机产生编号数和该编号数的重量,做到真正的随机,而非人为指定*/



weight_rand=5.0+(pow(-1,(random(10)+1))*(random(10)+1)/10));



a[keep_rand]=weight_rand; /*下面的目的是要找这个随机数是多少*/



printf("\n\n-------------------------------\n");



for(i=0;i<3;i++)



{ m=sum(st1,st1+step,a);n=sum(st2,st2+step,a);



printf(" m=%3.2f,n=%3.2f,st1=%d,st2=%d,end=%d;\n",m,n,st1,st2,end);



if(m!=n&&step=6) end=12;



if(m==n) {find_rand=end;break;}



elseif(step!=1)



if(m!=5*step) {step=step/2;st2=st1+step;end=(st1+end)/2;}



else {step=step/2;st1=st2;st2=st2+step;}



else fidn_rand=find(m,n,end,st1,st2);



}



printf("--------------------------------------\n");



/*通过保存产生的编号和该球的重量来检察程序是否正确*/



printf("keep_rand=%d,weight_rand=%3.2f",keep_rand,weight_rand);



printf("the randomize number is :%d",find_rand);



if(a[find_rand]>5) printf("random weight > 5 :%3.2f\n",a[find_rand]);



else printf("random weight < 5 :%3.2f\n",a[find_rand]);



}





float sum(int i,int j,int a[])



{float s=0.0;int m;



for(m=i;m<j;m++)



s=s+a[m];



retturn s;



}





int find(float m,float n,int end,int st1,int st2)



{ if(m==n) return end;



else if(m!=5) return st1;



else return st2;



}





以上程序在turbo c 2.0 测试通过。





球的轻重是可以判断的,但是重量是不可以求的。在以上的程序中通过随机产生一个正负



值来比较的。



pow(x,y)的功能是求X的Y次方。





busyworker 2002-03-30
  • 打赏
  • 举报
回复
我可以证明我的例子是最优解之一:
称量过程可以看成一棵3层3叉树,共有27个外部节点。
13个球共有13*2=26种状态。
但是,在第一次称量时,天平两边加上剩余的,共有3个
分组,13个球分3组,其中之一必然不少于5个;当坏球
位于该分组时,对应3叉树的一个2层子树,而该2层子树
只有3*3=9个外部节点,但是该分组数不小于5,状态数
不小于10,至少有一个球,无法判断其轻重。
因此,不可能检索所有状态。
由上可知,可以构造坏球检索算法,但是无法构造检索
算法得到所有的坏球状态。(在我的例子中,为c5)
busyworker 2002-03-30
  • 打赏
  • 举报
回复
A(a1,a2,a3,a4),B(b1,b2,b3,b4),C(c1,c2,c3,c4,c5)
begin:
?A,B
1: if = then
?(a1,a2,a3),(c1,c2,c3)
1.1 if = then
1.1.1 ? a1,c4
if = then out(c5) else out (c4)
1.2 if > then
1.2.1 ? c1,c2
if = then out(c3) else(if > then out(c2)
else out(c1)
1.3 if < then
1.3.1 ? c1,c2
if = then out(c3) else(if > then out(c1)
else out(c2)
2: if > then
?(a1,c1,b3),(b1,b2,a2)
2.1 if < then
2.1.1 ? c1,b3
if = then out(a2)
else out(b3)
OK! Now,结果为>,有(a1,c1)>(b1,b2),结果为=,有(a3,a4)>(b4,c1) /推理得到
2.2 if > then
2.2.1 ?(a1,b1),(c1,c2)
if = then out(b2)
if < then out(b1)
if > then out(a1)
2.3 if = then
2.2.1 ?(a3,b4),(c1,c2)
if = then out(a4)
if < then out(b4)
if > then out(a3)
3: if <........

end

唯一在c5时,无法确定轻重
vallan 2002-03-29
  • 打赏
  • 举报
回复
可以结贴了!
我都快要疯了!
vallan 2002-03-29
  • 打赏
  • 举报
回复
我收回我的话!
我研究了上面的算法!
有解!
现在贴出来!
分成3组:
A组:1, 2, 3, 4
B组:5, 6, 7, 8
C组:a, b, c, d, e

if A=B then 坏球在a, b, c, d, e中
if 123==abc then 坏球在d, e中
if 1=d then 坏球是e
else 坏球是d
elseif 123>abc then 坏球在a, b, c中且轻
if 1a=2b then坏球是c
elseif 1a>2b then 坏球是b
else 坏球是a
elseif 123<abc then 坏球在abc中且重
if 1a=2b then坏球是c
elseif 1a>2b then 坏球是a
else 坏球是b
elseif A>B then 坏球在12345678中
if 34567=abcde then 坏球在128且1 or 2>8
if 28=ab then 坏球是1
elseif 28>ab then 坏球是2
else 坏球是8
elseif 34567>abcde then 坏球为3, 4且重
if 3=a then 坏球是4
else 坏球是3
else 坏球为567且轻
           if 5a=6b then 坏球是7
elseif 5a>6b 坏球是6
else 坏球是5
else 坏球在12345678中
if 34567=abcde then 坏球在128且1 or 2<8
if 28=ab then 坏球是1
elseif 28>ab then 坏球是8
else 坏球是2
elseif 34567>abcde then 坏球为567且重
          if 5a=6b then 坏球是7
elseif 5a>6b 坏球是5
else 坏球是6
else 坏球为3, 4且轻
if 3=a then 坏球是4
else 坏球是3
vallan 2002-03-29
  • 打赏
  • 举报
回复
不对不对!
前提是不知道非标准球是轻还是重的!
所以我认为此题无解!
platinum 2002-03-28
  • 打赏
  • 举报
回复
不是吧?最基础的《离散》的题啊!而且是例题!这也拿来做考题,什么玩意啊

我没听错吧?华为就出这题?!
whgwj 2002-03-28
  • 打赏
  • 举报
回复
此题不对吧,应该是其中有一球较轻或较重,而不是重量不同吧。如果只知道重量不同,而不知是轻是重,三次是称不出来的。
shadou 2002-03-28
  • 打赏
  • 举报
回复
称k次可以在 (3^k -3)/2 个球中找出不同的球!!!!!!
Jingxh 2002-03-28
  • 打赏
  • 举报
回复
1、六六称,若相同,为剩下的重,否则挑出重的一组;
2、三三称,若相同,为剩下的重,否则挑出重的一组;
3、一一称,若相同,为剩下的重,否则挑出重的一个;
ntzhangwb 2002-03-28
  • 打赏
  • 举报
回复
同意li2587的方法,只是有点小修改(更明了)
第一次:
左:1、2、3、4 右:5、6、7、8
A1、相等,目标球在{9、10、11、12、13}中
B1、左边重,目标球在{1、2、3、4、5、6、7、8}中
C1、右边重,目标球在{1、2、3、4、5、6、7、8}中

第二次:
IF A1:
左:1、2、3 右:9、10、11
A2:相等,目标球在{12、13}中
(下一步用1号和12号比较,相等则目标球为13号;不相等则目标球为12号)
B2:左边重,目标球在{9、10、11}中,目标球偏轻
(下一步用9号和10号比较,相等则目标球为11号,不相等则为偏轻者)
C2:右边重,目标球在{9、10、11}中,目标球偏重
(下一步用9号和10号比较,相等则目标球为11号,不相等则为偏重者)

IF B1:
左:2、3、4、5、6 右:9、10、11、12、13
A2:相等,目标球在{1、7、8}中
(下一步用7号和8号比较,相等则目标球为1号,不相等则详见第三步)
//应为不相等则目标球为7号和8号中的较轻者
B2:左边重,目标球在{2、3、4}中,目标球偏重
(下一步用2号和3号比较,相等则目标球为4号,不相等则为偏重者)
C2:右边重,目标球在{5、6}中,目标球偏轻
(下一步用5号和6号比较,为偏轻者)
IF C1:
左:2、3、4、5、6 右:9、10、11、12、13
A2:相等,目标球在{1、7、8}中
(下一步用7号和8号比较,相等则目标球为1号,不相等则详见第三步)
//应为不相等则目标球为7号和8号中的较重者
B2:左边重,目标球在{5、6}中,目标球偏重
(下一步用5号和6号比较,为偏重者)
C2:右边重,目标球在{2、3、4}中,目标球偏轻
(下一步用2号和3号比较,相等则目标球为4号,不相等则为偏轻者)



xmxmlt 2002-03-28
  • 打赏
  • 举报
回复
回家想了一下,归纳进来,一个原理:
对于已知坏球是轻还是重的情况:3个球称一次即可有答案。
因此在这种情况下推回去:称二次可对9个球进行判断,即3^2,
而称三次则可对9*3=3^3=27个球进行判断,
称n次则可对 3^n 个球进行判断。
tcice 2002-03-28
  • 打赏
  • 举报
回复
对于这个问题我们就不要讨论了,因为球是12个和13个的结果是一样的,把球分成4个一组就可以了,剩下的一个对结果没有什么影响,好了,不说了,结果是可以在三次中把坏球给找出来
xmxmlt 2002-03-27
  • 打赏
  • 举报
回复
对不起,写错了,最多应该是 15 个球中的一个坏球。
xmxmlt 2002-03-27
  • 打赏
  • 举报
回复
按刚才的说法,三次最多可以称出14个球中的一个坏球 !
也就是:6, 6, 3 分组
xmxmlt 2002-03-27
  • 打赏
  • 举报
回复
分组:5, 5, 3
不明的都会明白了。
这是一类问题,不管开始怎么分,最后一组一定会是 2 或 3 才能一次称出结果
vallan 2002-03-24
  • 打赏
  • 举报
回复
li2587() 错了!

你的算法是默认不一样的球是比其他重的!

前提已经错了!
gois 2002-03-24
  • 打赏
  • 举报
回复
Last year I invented a balance, and it can show 12 digits for 12 different balls (or same balls) one time.So it need only one time to get the ball we want!
gois 2002-03-24
  • 打赏
  • 举报
回复
Is This Data Structure Or Arithmetic?
But It's very fun.
加载更多回复(81)

33,028

社区成员

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

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