论坛首页 综合技术论坛

讨论一个算法,GOOGLE的一个面试题

浏览 60059 次
精华帖 (8) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-31  
不错,正确答案出来了
0 请登录后投票
   发表时间:2008-11-01   最后修改:2008-11-07
第一场 A1,A2,A3,A4,A5 第一场第一名 AX(假设是A1)
第二场 B1,B2,B3,B4,B5 第二场第一名 BX(假设是B1)
第三场 C1,C2,C3,C4,C5 第三场第一名 CX(假设是C1)
第四场 D1,D2,D3,D4,D5 第四场第一名 DX(假设是D1)
第五场 E1,E2,E3,E4,E5 第五场第一名 EX(假设是E1)

AX,BX,CX,DX,EX  得出第一名 XX1 并且排序(因为是在一起比所以肯定能得到这个顺序),假设 AX>BX>CX>DX>EX ,XX1即是AX,因为XX1间接的跟每组的比过了,比如XX1大于BX说明比B1,B2,B3,B4,B5都快

BX,A2,A3,A4,A5  得出第二名 XX2 

CX,B2,B3,B4,B5  得出第三名 XX3

DX,C2,C3,C4,C5  得出第四名 XX4

EX,D2,D3,D4,D5  得出第五名 XX5

这是10次的比法,什么情况是比的最小的呢?
0 请登录后投票
   发表时间:2008-11-01  
前5场确定每匹马在本队中的顺序,
然后每场比赛确定一匹马,然后淘汰几匹
到第9场的时候,只剩下5匹马比赛,结果就出来了。right?
0 请登录后投票
   发表时间:2008-11-01  
五场过后,每一组的第一名进行赛跑,如果赢了则将其从这一组抽走,再以剩下的第一名继续跑,比如说A1第一名抽走了,A2,B1,C1,D1,E1继续跑。不要说B1,C1,D1,E1在之前的A1,B1,C1,D1,E1那一轮已经跑过了,这一组再跑是浪费,因为你不知道A2在B1,C1,D1,E1之间的哪个位置,所以必须让A2和他们全部跑一次才能决定。所以每一次都是有必要的,最好的情况下会出现A2直接比E1慢的情况,直接跑两次就决定了前五名,但是最糟糕的情况肯定要跑满10次
0 请登录后投票
   发表时间:2008-11-02  
stormspire 写道
我也并不知道标准答案,下面是我的思路:
第6轮完毕是
A组 A1,A2,A3,A4,A5
B组 B1,B2,B3,B4,--
C组 C1,C2,C3,--,--
D组 D1,D2,--,--,--
E组 E1,--,--,--,--
假设 A1>B1>C1>D1>E1

第二名没有什么悬念,肯定是A2,B1中的一个
第三名也没有悬念,是A2,A3,B1,B2,C1中的一个

所以拿A2,B1,A3,B2,C1 比一轮 (第7轮),那么可以得出第2、3名,并且可以淘汰第5名,以及第5名所在的其余成员
下面的就麻烦了。

1. 最简单情况,如果A2,A3是前两名,那么第4、5名就是A4,A5,B1,B2,C1里面,再比第8轮就可以
2. 如果A2,B1是前两名,再比第8轮也可以得出结果。我就不仔细分析了。
3. 最复杂的情况就是B1和C1是前两名,
   3.1 如果A3是最后一名,剩下
A组 A1,A2,--,--,--
B组 B1,B2,B3,--,--
C组 C1,C2,C3,--,--
D组 D1,D2,--,--,--
E组 E1,--,--,--,--

  这里就有A2,B2,B3,C2,C3,D1,D2,E1 8匹马来竞争最后的2个名额. A2,B2比过,所以
第4名可以在 A2,B2中的快者,然后加上C2,D1中比出来,假设我第8轮只用3匹马比,可以得出第4,而且可以淘汰第3名以及比第3名慢的马。所以第8轮可以至少淘汰2匹,加上选出来的第4,那么第9轮只剩下5匹马了,可以得出结果。

  3.2 如果B2是最后一名,剩下
A组 A1,A2,A3,--,--
B组 B1,--,--,--,--
C组 C1,C2,C3,--,--
D组 D1,D2,--,--,--
E组 E1,--,--,--,--

  可以发现这个图比上面的还简单,所以不会比3.1多

综上,觉得至少应该比9轮


关于第七轮的分析:
1. 最简单情况,如果A2,A3是前两名,那么第4、5名就是A4,A5,B1,B2,C1里面,再比第8轮就可以

如何能够确定B3,B4就在前五名开外呢?
0 请登录后投票
   发表时间:2008-11-02  
最多要十轮可以比出前5名
前六轮同楼主
第七轮时,第一名已经找到了,也就是说要找到第二名,这只只用B1和A2\A3\A4\A5比就可以得出第2名
以此类推只要找出其后的几名既可
0 请登录后投票
   发表时间:2008-11-03  
最多10轮,最少7轮。没有必要再讨论了,答案很明确。
0 请登录后投票
   发表时间:2008-11-03  
以下是我的思路- -

首先前6次比赛按照楼主的思路..

然后画出结果表格。如附件1的图1,表格里的数字代表这批马可能跑到的最好排名

根据前6场的比赛结果我们可以很容易得到以下3条结果:

从横向方向来看:右边那匹马的可能的最好成绩是左边一匹最好成绩+1,比如A2可能的最好成绩是第2,则A3的可能最好成绩是第3

从纵向方向上来看:在第1列上,下面那匹马的最好成绩是是上面那匹马的最好成绩+1,比如B1可能的最好成绩是第2,则C1可能的最好成绩是第3

表格中数字唯一:即代表这批马的排名...比如A1是第一。为了方便起见,标明为绿色

下面是第7轮的比赛算法..
选择没有确定排名的,数字最小的5匹马进行比赛,如附件1中图1的红色部分标明的5匹马..把排名填写在表中。因为第一名已经确认,所以从第2名开始排列

假设排名结果如附件1图2这样的结果(紫色部分)。

根据前面得到的3个条件,更新表格中马匹的最好成绩...见附件1图3。

很显然,最好成绩在第6名以后的可以直接淘汰..

然后重复以上循环即可得出跑得最快的5匹马...

最少需要8轮,即附件1所示那种情况。

以上算法可以扩展到有N匹马,M个赛道中...

但是题目问的是 至少 需要多少场比赛...也就是说运气最好的情况下可以确认前5的比赛场数...

所以答案得靠...凑

首先每匹马都得至少进行一场比赛,所以前5场比赛没有悬念...

关键在于第6场...将A5和B1,C1,D1,E1拉一起比...
如果运气够好,A5第一胜出...
排名就是A1,A2,A3,A4,A5。
最少需要 6场 比赛就能够确定名次..



  • 大小: 32.9 KB
  • 大小: 81.8 KB
0 请登录后投票
   发表时间:2008-11-03  
至少 8 场
0 请登录后投票
   发表时间:2008-11-03  
一个a[5][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

前六场都没有争议的。
但可以得出:
   a1,b1,c1,d1,e1每一匹马都比它们右下方的马快。
   每横行都是左边的比又边快。
   a1 是第一名,入围了。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

由于b1大于它左下方的。a2大于它右边的,所在第二名就在了b1和a2中。
(其实我觉得离空位最近的最有可能。)
所在第七场我们把 b1 , c1 , b2 ,a2 ,a3 拿来比。
(其实第一名肯定是在b1,a2中的)
如果a2比b1快。a2移到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
      我们可以知道 其它四道b1,c1,b2,a3中,b1大于c1,b2.所以第三名应在b1与a3中。
这一轮我们决出了两名。

第八场,在第七场的基础上。同理可得两名。五名就出来啦。
(每一匹马快于右下方的马)
(每次拿最近左上角的马比。)

0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics