最少比赛天数为多少?

gofor 2001-12-31 10:43:34
加精
128名选手参加比赛,每名选手每天只能比赛一次。用尽可能少的天数决出所有名次(1~128名)。求算法。
...全文
566 64 打赏 收藏 转发到动态 举报
写回复
用AI写文章
64 条回复
切换为时间正序
请发表友善的回复…
发表回复
huihui3000 2002-02-05
  • 打赏
  • 举报
回复
我想说.....................
mathe 2002-01-25
  • 打赏
  • 举报
回复
To intfree,
你那个同学是女孩子?那实在了不起。
好像女孩子向来是同数学无缘(或者说数学无缘于结识女孩子)。
gofor 2002-01-24
  • 打赏
  • 举报
回复
intfree(): 请你再问问她。我们很想知道具体解法。
jett 2002-01-24
  • 打赏
  • 举报
回复
噢 看错了对不起
jett 2002-01-24
  • 打赏
  • 举报
回复
答案是n*(n+1)/2不会吧?
每多一人要多n天?
那如果用一下归纳法

n人时假设已经决出了这n个人的名次
再加一个人,在n天里分别和这n个人比
这不是正好(n+1+1)(n+1)/2

这会是最优解,那个MM在唬你吧
gofor 2002-01-24
  • 打赏
  • 举报
回复
mathe的解法是对的,实际步骤类似归并排序,只不过两个已排序序列的归并方法不同。对2^n名选手,能保证在n(n+1)/2天完成任务,应该是最优解法了!
rushing 2002-01-24
  • 打赏
  • 举报
回复
如果用单淘汰:7天
如果用单循环:127天
congling 2002-01-24
  • 打赏
  • 举报
回复
看来我理解错题目了,Sorry
intfree 2002-01-24
  • 打赏
  • 举报
回复
mathe使我回忆起了那个证明,就是他那样证的。
简单的讲就是这样:
1. 命题A:|a|=|b|=2^(n-1),a, b排好序,则只需n天。
2. 加强命题A,得到命题B:|a|+|b|=2^n,a, b排好序,则只需n天。
3. 归纳法证明命题B(即命题A)。
4. 用命题A,归纳证明最后的结论。
所用到的“技巧”是:两次归纳构造和加强命题
congling 2002-01-24
  • 打赏
  • 举报
回复
1,2,3,4,5,6,7,8

1) 12 34 56 78 --1357为胜者
2) 13 57 24 68 --1526为胜者
3) 15 26 37 48 --1234为胜者
顺序应该是1,5,3,7,2,6,4,8
可以使用数学归纳法证明,2^(n)人只要n次就可以决出顺序

第一天分成,2^(n-1) vs 2^(n-1)胜利者为2^(n-1)个,失败者为2^(n-1)
其后,2^(n-1)胜者/败者决出2^(n-1)个名次化n-1天,然后把2^(n-1)胜者放在败者顺序之前,那就可以组成2^n个名次了




congling 2002-01-24
  • 打赏
  • 举报
回复
如果有2^n个人,我真的想不出有什么难的,
先分成2^(n-1)比,胜利者为2^(n-1),同时失败者也为2^(n-1),即每天产生的胜利者和失败者一样多。
因此应该是n天为最小值才对啊!为什么是n(n-1)/2实在想不通。
mathe 2002-01-24
  • 打赏
  • 举报
回复
1。
2^n个人先分成两组,花费(n-1)n/2天,各自独立排序。

2。对于两个已经排列好的队列倒序进行归并。假设第一队列有a人,第二个队列b人(a>=b,a+b为2的幂)。
将第一组的人按大到小排列,将第二组按小到大排列,将对应位置上的人进行比较大小(第一个队列前后个(a-b)/2个人不参与比较。假设第二个队列前面k个人都比a中对应的选手差,后面b-k个人比a中对应的选手好。在k<>0而且k<>b时。我们将a的前面(a-b)/2+k个人记为队列a1,后面(a-b)+2+b-k个人记为a2,同样的有b1,b2
所以a1中所有的人大于a2和b1中的。b2中所有的人大于a1和b2的。
而且count(a1)+count(b2)=(a+b)/2 = count(a2)+count(b1),所以我们只现在需要并行比较a1 和b2两个排好序的队列相互的大小以及a2和b1两个排好序的队列的相互大小,递归调用2过程就可以了。
如果k=0,表示b中的所有人都比a中后面b+(a-b)/2个人大,只需要比较b中所有人同a中前面(a-b)/2个人的大小了,这两个队列的人的总数正好也是b+(a-b)/2=(a+b)/2,还是可以递归调用2过程。
同样对于k=b时,处理的方法也类似。
也就是,每次经过一次2中的调用,我们花费了一天,两个需要比较的子队列的长度之和减少一倍。所以最多再经过n天,就没有需要比较的队列了。
所以总共花费时间(n-1)n/2+n=n(n+1)/2,正好归纳假设成立。
intfree 2002-01-23
  • 打赏
  • 举报
回复
是一道数学竞赛的题目
intfree 2002-01-23
  • 打赏
  • 举报
回复
n = 128
m = log(2, n) = 7
mindays = (m + 1) * m / 2 = 7 * 8 / 2 = 28

以前我的一个同学给我讲过这道题目,只是不记得了,
今天又碰到了她,才回忆起这个结论。

用的是“相当复杂的二分法”
intfree 2002-01-23
  • 打赏
  • 举报
回复
to mathe()

对不起了,我无法提供更详细的信息。
第一次听这道题目的解答是很多年前,当时的感觉是在云雾之中,
只记得是二分法构造,很复杂,但结论肯定是对的(这是当时的感觉)。
今天我只问到了结论,如需严格证明,可能还要一定时间才想得出(最近比较忙)。
那位同学还强调了两点:
1. 这道题目需要相当的数学技巧(当然,这是针对我来说的)。
2. 这个界相当优了(即可能不是最优,但怀疑是最优)。
附结论:
2^n个人,只需n(n+1)/2天

当我问她,是不是n个人需要n天时,被她大骂一顿,真没面子 :(
lrzhou 2002-01-23
  • 打赏
  • 举报
回复
看赛制,如世界杯决赛2天决出1,2,3,4名一样:
1天,决出前64强和后64强
2天,前64强决出前32强和33-64强,后64强决出65-96强和97-128强
...
...
...
...
7天,决出所有128强!!!!!!
mathe 2002-01-23
  • 打赏
  • 举报
回复
是不是将两个有序队列倒叙进行比较,分裂成两个集合,其中一个集合中所有元素都大于另一个元素呢?而且每一个集合都正好包含两个有序子序列?
不过这种方法的问题是各个子序列的长度会不均匀化,导致最差情况下效果没有想象中的好。
过客猫2022 2002-01-22
  • 打赏
  • 举报
回复
所以15天就可以决定了![注:当然也可14天,先6天循环赛, 后8天淘汰赛]
过客猫2022 2002-01-22
  • 打赏
  • 举报
回复
先用分组循环,再用淘汰赛,如同世界杯那样的比赛。以4人一组,共32组,进行循环比赛,每组前2名进入64强,剩下的争后64名,三天就可决定前64名及后64名。然后又是4人一组,就可得到1~32,33~64,65~96,97~128名,再过三天,就可以得到1~16,17~32,...128,这样就得取了8组每组16人。然后进行淘汰赛,取其中16人来说,假定他们分别原小组排名第一,第二,然后将原8个组,分成四组,每组由原组中前2名组成,然后每组中,原小组第一与另一原小组第二比赛,两天就可以分出1,2,3,4名,前两名进级争8强,然后4强,然后冠军,这样算下来,共需9天循环赛,6天淘汰赛,共15天比赛,可以决定这128名的排名。[出现了同名次时,且比平时,可以像世界杯那样[点球大战,加时赛,净胜球等等]]。
gofor 2002-01-22
  • 打赏
  • 举报
回复
对,是排序算法,但与普通的排序算法不同,这是并行算法,一次可以做N/2个比较。
加载更多回复(44)

33,009

社区成员

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

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