锁定老帖子 主题:讨论一个算法,GOOGLE的一个面试题
精华帖 (8) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-21
apptech 写道 必须进行的五场比赛就不说了。从第六场比赛开始吧:在每组的第一名进行第六场的比赛,然后第一名直接晋级,再由第一名所在对的下一名和剩下的四匹马进行比赛,以此类推,五轮比赛后即可得出跑的最快的无匹马。
正解啊 |
|
返回顶楼 | |
发表时间:2008-11-22
六次就ok了
|
|
返回顶楼 | |
发表时间:2008-11-22
晕,啥时代了?连个计时器都没有啊?
|
|
返回顶楼 | |
发表时间:2008-11-24
1-5轮:分成5组分别比赛。(不是最好,但最简化)
6轮 :每组的第2名比赛。从快到慢(从小到大)依次命名为a2,b2,c2,d2,e2。按照这个规则给所有的马命名。 此时a1肯定入围,其余争夺前4。将a1排出讨论。 b4比a2,b1,b2,b3都大,所以不可能入围。 c2比b1,c1,a2,b2都大,也不可能入围。 所以只有剩下的a2,a3,a4,a5,b1,b2,b3,c1,d1,e1争夺前4。其中a2<a3<a4<a5,b1<b2<b3, a2<b2 7轮 :将a3,b2,c1,d1,e1比赛。此次比赛的第一名直接入围,剩下的角逐前3。因为c1,d1,e1的等价性,不妨根据比赛结果设c1<d1<e1。然后分情况讨论: 引论甲:如果b3要入围,那么入围人选只能是a1,b1,a2,b2,b3。所以这场比赛b2,a2分别占据前二才行。 如果a3排第一。那么a2,a3直接入围。此次比赛的第二名,第三名和b1,a4,a5决出最后2名入围者。总共是8。 如果a3排第二,c1第一。比a3快的只可能c1,a2,b1,所以a2,a3直接入围。剩下的a4,a5,b1和这轮第三名,第四名争夺最后一名入围者。总共8轮。如果a3排第二,b2第一。b1,b2,a2直接入围。最后一个名额由a3,b3和刚才第三名争夺产生。总共8轮。 如果a3排第三。那么刚才比赛最后2名直接失去比赛资格。可能比a2小的只有前2名和b1,所以a2直接入围。再加上前两名直接入围。第6轮结束剩下的10名选手中,3名入围,2名失去资格,剩下的5名选手刚好可以一场比赛决出最后一个名额。总共8轮。 如果a3排第四。a3,a4,a5都失去资格。根据引论甲,b3也失去资格。只剩下有a2,b1和刚才的前三名,5人只需要一场比赛即可。总计8轮。 如果a3第五。a3,a4,a5失去资格。根据引论甲,b3失去资格。比赛前2名直接入围。剩下的4人再进行一场比赛即可。总计8轮。 所以按照这种算法,最多8轮就可以决出前5名。 |
|
返回顶楼 | |
发表时间:2008-11-24
复杂的问题,挺不容易,所谓的正解,有些牵强
|
|
返回顶楼 | |
发表时间:2008-11-25
给一个比赛的办法:
1) 1-5轮,分成5组分别比赛,按照比赛结果从快到慢排成5组 2) 从5组中抽出最快进行比赛,把最快的放到一边去,它肯定是第一,是前5名之内的;最慢的所对应的那一组的余下4匹被淘汰,因为比它快的就有5个,肯定是在前5名之外。把余下的4匹按照从快到慢的顺序马排成一组,进入被淘汰的那一组的位置。 3) 重复上面的方法4次,得到5匹最快的马。 |
|
返回顶楼 | |
发表时间:2008-11-25
最后修改:2008-11-25
10场是正确的。一匹马只要在横向和竖向都排第一,一定是这个矩阵中最快的,被选出来。
[有N匹马,有M个赛道,试问要至少多少场比赛才能知道跑得最快的Y匹马。] A1 A2 A3 A4 A5 B1 B2 B3 B4 B5 C1 C2 C3 C4 C5 D1 D2 D3 D4 D5 E1 E2 E3 E4 E5 int c1 = N % M ==0 ? N / M : N / M + 1; //经过c1轮比赛得到一个矩阵. int count = c1 + Y; //再经过Y次比赛找到最快的. 每次从最左竖列开始,选中一个后其所在横列顺序补上. 需要count次。(最多也就需要count次就可以了.) |
|
返回顶楼 | |
发表时间:2008-11-26
shiwei2006 写道 10场是正确的。一匹马只要在横向和竖向都排第一,一定是这个矩阵中最快的,被选出来。
[有N匹马,有M个赛道,试问要至少多少场比赛才能知道跑得最快的Y匹马。] A1 A2 A3 A4 A5 B1 B2 B3 B4 B5 C1 C2 C3 C4 C5 D1 D2 D3 D4 D5 E1 E2 E3 E4 E5 int c1 = N % M ==0 ? N / M : N / M + 1; //经过c1轮比赛得到一个矩阵. int count = c1 + Y; //再经过Y次比赛找到最快的. 每次从最左竖列开始,选中一个后其所在横列顺序补上. 需要count次。(最多也就需要count次就可以了.) 我也觉得需要10场 |
|
返回顶楼 | |
发表时间:2008-11-26
应该9场就可以出来
前5场: A1>A2>A3>A4>A5 B1>B2>B3>B4>B5 C1>C2>C3>C4>C5 D1>D2>D3>D4>D5 E1>E2>E3>E4>E5 第6场:A3>B3>C3>D3>E3,剩下 A1>A2>A3>A4>A5 B1>B2 C1>C2 D1>D2 E1>E2 第7场:A3,B1,C1,D1,E1比较,有下面几个结果: 1)A3>B1>C1>D1>E1,结果为 A1>A2>A3>A4>A5 B1>B2 C1 此时再比一场即共8场结果就出来了。 2)B1>A3>C1>D1>E1,结果也为 A1>A2>A3>A4>A5 B1>B2 C1 3)B1>C1>A3>D1>E1,结果为 A1>A2>A3 B1>B2 C1>C2 再比一场也出来了 4)B1>C1>D1>A3>E1,结果为 A1>A2 B1>B2 C1>C2 D1>D2 也是再比一场出结果 5)B1>C1>D1>E1>A3,结果为 A1>A2 B1>B2 C1>C2 D1>D2 E1>E2 此时需再比两场即共9场才能出结果 |
|
返回顶楼 | |
发表时间:2008-11-26
phpxer 写道 看到最后,有点失望。如果换成是5000匹马,取最快的2000批,按照上面列位的穷举法... 怎么就没有人把这个算法用算数式表达出来呢?
这里的同志哥大多都把cs专业学没了。 |
|
返回顶楼 | |