一道编程题,请各位高手帮忙

时间:2022-09-17 14:16:22
一道编程题;n个球队进行循环赛  但每队每天只能出场一次,现排一个赛事,使得循环赛在最短时间内完成。n为 偶数 每天有n/2场比赛 历时n-1天 结果用表格形势
   帮我呀 
   谢谢

29 个解决方案

#1


用什么编呀?

#2


这是我一个同学问我的,我也不清楚用什么语言。我猜可能 是C或者是VB ,大哥帮我一下吧
 谢了

#3


这个是离散里的数理逻辑那部分的题目啊,好熟

#4


不会

#5


制表我不知道怎么做,不过我可以试试自己的办法。

main()
{int n,i,j,k,t;  
       /*n由题目决定具体数值*/
       /*i为天数(即第i天)*/
       /*j为赛事(某天的第j场赛事)*/
       /*k,t为队的编号(即k队 vs t对)*/
 for(i=1;i<=n-1;i++)
 for(k=1;k<=n;k++)
  if(k) 
    for(t=1;t<=n;t++)
    while(t=k) break;
  for(j=1;j<=n/2;j++)
   {
       printf("Day%d\n",i);
       printf("\t  Team_A  Team_B\n");
       printf("Match%2d %8d  %8d\n",j,k,t);
    }
  printf("\n");
}


#6


修改一下:

main()
{int n,i,j,k,t;  
       /*n由题目决定具体数值*/
       /*i为天数(即第i天)*/
       /*j为赛事(某天的第j场赛事)*/
       /*k,t为队的编号(即k队 vs t对)*/
 for(i=1;i<=n-1;i++)
 {for(k=1;k<=n;k++)
  if(k) 
    for(t=1;t<=n;t++)
    while(t==k) break;
  for(j=1;j<=n/2;j++)
   {
       printf("Day%d\n",i);
       printf("\t  Team_A  Team_B\n");
       printf("Match%2d %8d  %8d\n",j,k,t);
    }
  }
  printf("\n");
}


我机子的键盘有点问题,在tc中“ \”这个符号打不出来,所以没有调试,不好意思啊1

#7


一道编程题;n个球队进行循环赛 但每队每天只能出场一次,现排一个赛事,使得循环赛在最短时间内完成。n为 偶数 每天有n/2场比赛 历时n-1天 结果用表格形势
把楼主的题实例化:
设有6个队进行循环赛,但每队每天只能出场一次,现排一个赛事,使得循环赛在最短时间内完成,每天有3场比赛。5天比赛完。则可能的循环赛对组为(设队号为1-6)
1-2,1-3,1-4,1-5,1-6,2-3,2-4,2-5,2-6,3-4,3-5,3-6,4-5,4-6,5-6共15组,实际就是C(2  6).
手工列出比赛日程:
第一天:1-2 3-4 5-6
第二天:1-3 2-5 4-6
第三天:1-4 2-6 3-5
第四天:1-5 2-4 3-6
第五天:1-6 2-3 4-5
不知还有没有别的排法。且我没看出规律来能编程实现,抛砖引玉吧。

#8


to hillyee(山之笛):
上机结果错误。

#9


楼主,你要先弄清思路!向bigtea(企鹅)一样!

#10


to:bigtea(企鹅)

我上机调试的时候因为有个符号打不出来,所以也不知道是什么地方的错误。
你可以说的清楚点吗?

还有就是语句中的break语句,我没什么把握,也许应该是continue语句更好点。

#11


既然n只队伍,每天n/2只队伍比赛,n-1天赛完,我不知道求什么最短时间?难道不是一句这个吗?每天有n/2场比赛 历时n-1天,所以我觉得这个题好像用程序来实现,我觉得没有什么意义,就像前面的那位老兄说的,就是排列组合嘛,所需要的就是打印,这就是这个程序最主要的工作了,至于最短时间,我实在不知道什么意思,哪位明白再讲讲吧!!!!!

#12


to:楼主

我说说的解题思路吧:
①在每一天里,安排赛事,例如第一队(既是k=1)和对二队(既是t=2)比赛。首先是第一队和其他的n-1个队的比赛,分配在每一天里就可以了,只要保证(k<t),这样就可以保证比赛不会重复,用for(k=1;k<=n;k++)当第一队时和其他队比赛。
②用for(i=1;i<=n-1;i++)来循环每天,从第一天到到最后一天。
③就是制表了,表里面的线我不会,不过格式倒是可以搞出来,就像上面那样就可以了。


*****大家讨论一下,共同提高*****

#13


循环赛在最短时间内完成,与历时n-1天 ,矛盾吗??

#14


循环赛在最短时间内完成,与历时n-1天 ,不矛盾吗??

#15


如果历时n-1天 
同意 hillyee(山之笛)

#16


同意liuhaibao(网络人生)兄,这个本来就不是求什么最优解的程序,不过用计算机给出一种排法在打印出来.不是很有挑战性..

#17


是啊,我觉得题目还是有问题,山笛的想法我看了,你只是按照n-1天的将比赛安排了一下,你怎么能证明n-1天是最短的时间呢?

#18


如果按照题意思,比赛一定是在n-1内完成的,所以这句话根本就没有什么意义。真的没有必要深究的!

#19


main()
{   
  int n,i,j,k,t; 
  for(k=1,j=1;k<=n&&j<=n/2;k++,j++)
  for(t=2;t>k&&t<=n;t++)
  for(i=1;i<=n-1;i++)  
   {   printf("Day%d\n",i);
       printf("\t  Team_A  Team_B\n");
       printf("Match%2d %8d  %8d\n",j,k,t);
    }
 
  printf("\n");
}

请有兴趣的朋友们帮我运行一下,应该已经可以了1

#20


真是非常感谢大家呀 有这么多热心的朋友,我真的好感动 

#21


To:hillyee(山之笛)
我运行了,但是结果还是不对

你的结果为:
Day1
  Team_A  Team_B
Match 1        1         2
Day2
  Team_A  Team_B
Match 1        1         2
Day3
  Team_A  Team_B
Match 1        1         2
Day4
  Team_A  Team_B
Match 1        1         2
Day5
  Team_A  Team_B
Match 1        1         2
Day6
  Team_A  Team_B
Match 1        1         2
Day7
  Team_A  Team_B
Match 1        1         2
Day1
  Team_A  Team_B
Match 1        1         3
Day2
  Team_A  Team_B
Match 1        1         3
Day3
  Team_A  Team_B
Match 1        1         3
Day4
  Team_A  Team_B
Match 1        1         3
Day5
  Team_A  Team_B
Match 1        1         3
Day6
  Team_A  Team_B
Match 1        1         3
Day7
  Team_A  Team_B
Match 1        1         3
Day1
  Team_A  Team_B
Match 1        1         4
Day2
  Team_A  Team_B
Match 1        1         4
Day3
  Team_A  Team_B
Match 1        1         4
Day4
  Team_A  Team_B
Match 1        1         4
Day5
  Team_A  Team_B
Match 1        1         4
Day6
  Team_A  Team_B
Match 1        1         4
Day7
  Team_A  Team_B
Match 1        1         4
Day1
  Team_A  Team_B
Match 1        1         5
Day2
  Team_A  Team_B
Match 1        1         5
Day3
  Team_A  Team_B
Match 1        1         5
Day4
  Team_A  Team_B
Match 1        1         5
Day5
  Team_A  Team_B
Match 1        1         5
Day6
  Team_A  Team_B
Match 1        1         5
Day7
  Team_A  Team_B
Match 1        1         5
Day1
  Team_A  Team_B
Match 1        1         6
Day2
  Team_A  Team_B
Match 1        1         6
Day3
  Team_A  Team_B
Match 1        1         6
Day4
  Team_A  Team_B
Match 1        1         6
Day5
  Team_A  Team_B
Match 1        1         6
Day6
  Team_A  Team_B
Match 1        1         6
Day7
  Team_A  Team_B
Match 1        1         6
Day1
  Team_A  Team_B
Match 1        1         7
Day2
  Team_A  Team_B
Match 1        1         7
Day3
  Team_A  Team_B
Match 1        1         7
Day4
  Team_A  Team_B
Match 1        1         7
Day5
  Team_A  Team_B
Match 1        1         7
Day6
  Team_A  Team_B
Match 1        1         7
Day7
  Team_A  Team_B
Match 1        1         7
Day1
  Team_A  Team_B
Match 1        1         8
Day2
  Team_A  Team_B
Match 1        1         8
Day3
  Team_A  Team_B
Match 1        1         8
Day4
  Team_A  Team_B
Match 1        1         8
Day5
  Team_A  Team_B
Match 1        1         8
Day6
  Team_A  Team_B
Match 1        1         8
Day7
  Team_A  Team_B
Match 1        1         8

#22


这道题的算法是关键。
先说各位的算法吧,得法出来了,自然易编程。

#23


可以考虑用轮转法来做。

#24


抱歉,让大家失望了!

#25


我是一个新手对c还不是很熟;
但可以肯定的是:最短肯定是 n-1天
因为是循环赛;每一个队要跟所有队比完,即要有(N-1)队

#26


/ teamMatching.cpp : Defines the entry point for the console application.
// destrition ; n个球队进行循环赛  但每队每天只能出场一次,现排一个赛事
//           使得循环赛在最短时间内完成。n为 偶数 每天有n/2场比赛 历时n-1天
// creator        ; XJUNP 29/5

#include "stdafx.h"
#include <iostream.h>

int _tmain(int argc, _TCHAR* argv[])
{
int num, team1, team2, day;
cout << " please input the team numer :  ";
cin >> num ;
cout << endl;

for (day=1;day <= num-1; day++)
{                                     
                   //???这儿如何控制每天输出                             
for (team1=1; team1<=num; team1++)
{
for (team2=2; team2<=num; team2++)
{
if (team1==team2)
break;
cout << "team1 :\t" << team1 << "\t"
     << "team2 :\t" << team2 << "\t" << endl;
}
}
}
return 0;
}


请高手解疑!

#27


赛程安排的优化设计 

(邵阳学院计算机系,湖南邵阳,422000)

摘要:本文假设多支球队在同一场地进行单循环赛,根据公平合理的原则,使各队每两场相邻比赛中间得到尽量多的较为均等休整时间,建立了轮转法模型及其扩充来安排赛程。首先对于5支球队的比赛,给出了一个各队每两场比赛中间都至少相隔一场的赛程, 然后证明了当n 支球队比赛时,各队每两场比赛中间相隔的场次数的上限是[(n-3)/2],在达到以上上限的条件下,利用轮转模型及其扩充编制了n=8和n=9的赛程,并编程实现。最后给出了衡量一个赛程优劣的其它指标,如总间隔数、平均间隔数、间隔数方差等,同时说明了以上所给赛程达到这些指标的程度。
关键字:单循环赛,尽量公平,轮转法及其扩充,上限 

1 问题的提出
假设多支球队在同一场地进行单循环赛,为公平合理,使各队每两场相邻比赛中间得到尽量多的较为均等休整时间,如何安排赛程呢?针对这一现实问题,提出了如下问题:
1) 对于5支球队的比赛, 给出一个各队每两场比赛中间都至少相隔一场的赛程。
2) 当n支球队比赛时, 各队每两场比赛中间相隔的场次数的上限是多少。
3) 在达到2) 的上限的条件下, 给出n=8, n=9的赛程, 并说明它们的编制过程。
4) 除了每两场比赛间相隔场次数这一指标外, 你还能给出哪些指标来衡量一个赛程的优劣, 并说明3) 中给出的赛程达到这些指标的程度。

2 基本假设
1) 每支球队在同一块场地上进行单循环赛。
2) 参赛队数有限。
3) 整个赛程是持续的,不考虑天气等意外事故,且赛程时间足够长。
4) 无任何队在赛程间中途弃权。
5) 一般仅考虑用每相邻两场比赛间隔这一指标来衡量赛程的优劣。

3 符号约定
    [n]:不大于取整,其结果为不大于n的最大整数。
    (m,n):表示m和n的一场比赛,其中m和n分别表示球队的签号。

4 基本概念及定义
单循环赛:也称单循环制,循环赛的一种,各比赛队之间相互轮赛一次。较多采用胜一场得2或3分,平一场各得1分,负一场得0分的计分方法。评定名次的办法一般采用按积分多少决定名次;如遇两队或两队以上积分相等时,则按积分相等的队在同一循环全部比赛中的净胜球、进球数的顺序决定名次,多者名次列前;如仍相等,则抽签决定名次。根据比赛的性质、任务,为了达到某种目的,计分与决定名次的办法可以有所变化,但必须在竞赛规程中作出具体明确的规定。总比赛场数= 。规定每轮中每队尽可能地参加比赛,但每队不得超过一场,可有轮空,故总比赛轮数,当参加队数是奇数时为:参加队数,若参加队数是偶数时为:参加队数-1。

上限:所有赛程安排方案中,任意方案中任意队的相邻两场比赛间隔的最小间隔的最大值。

5模型的建立及其合理性的分析
单循环赛中,在编排竞赛日程时应客观公正,合理安排各队的比赛场地和时间,赛后须有一定的休息时间,以保障运动员的健康与技术水平的发挥(全国甲级队比赛不 少于36小时,世界杯足球赛不少于48小时)。根据现实经验,并归纳分析,我们建立了轮转法及其扩充模型。
现实中竟赛编排一般采用逆时针轮转法列出赛程。
所谓逆时针轮转法,首先将参赛队数平均分为两半(参赛队为奇数时,可以 在后面加一个零号,使之成为双数),前一半自上而下列在左边, 后一半自下而上列在右边,然后用横线把相对的两个号数相连, 这就是第一轮的比赛。确定以后各轮比赛的方法是:把1号位 置固定不动,其余号数按逆时针方向轮换位置,每轮换一次就是一轮比赛。参加队数为奇数时,凡遇0号的队即为轮空。经抽签,各队对号定位,由此列出竞赛日程表。相应有顺时针轮转法。
为保证各队每两场相邻比赛中间得到尽量多的较为均等休整时间,可证明本模型对参赛队为偶数时,是最优模型之一。但对参赛队为奇数时,逆时针轮转法已不能保证各队每两场相邻比赛中间得到尽量多的较为均等的休整时间,因此我们提出了扩充的轮转法。所谓扩充的轮转法指的是每相邻两轮比赛中,所有队出场次序最多逆时针或顺时针移动一个位置。

6 问题的求解
6.1 问题1的求解及算法
利用穷举法较易求得其中一个合理的赛程为:
(1, 2)、(3, 4)、(5, 1)、(2,4)、(3,5)、(1,4)、(2,5)、(3,1)、(4,5)、(2,3)
较易看出各队每两场比赛中间都至少相隔一场。
6.2 问题2的求解及证明
当n支球队比赛时,各队每两场比赛中间隔的场次数的上限为[(n-3)/2]。
证明:有n支队伍,对任意一支队伍k , 设其相邻的两场比赛为 (k,i), (k,j),中间间隔p场比赛。现在即求p的上限值。由于此两场比赛已有k , i , j 参加,为达到间隔上限,中间p场比赛中不能出现此三支队伍,即还剩下n-3支队伍,且此n-3支队伍在p场比赛中最多只能出现一次。当n为奇数时,n-3为偶数,则p最多即为(n-3)/2场(此时(n-3)/2=[(n-3)/2])。当n为偶数时,n-3为奇数,则有一队要轮空,即p最多则为(n-3-1)/2场(此时(n-3-1)/2=[(n-3)/2])。综上所述,各队两场比赛中间隔的场次数的上限为[(n-3)/2]。
6.3 问题3的求解及算法
6.3.1 对于一般的n,我们定义如下扩充的轮转模型1,其赛程编制过程如下:
   1). 若n为奇数,
   ①. 置初值。A0={1,2,3,4,5,6,…,n}, t=0.
  ②.对At做(P3,P4) …(P2k+1,P2k+2)…(Pn-2,Pn-1) ,其中,(Pi,Pj)表示将第i位置的数与第j位置的数交换,下同,k<(n-1)/2且为自然数。得到序列 , t=t+1,At= 。
   ③. 如果t>=n-2, 结束,否则,继续向下做。
   ④. 对At做(P2,P3) …(P2k,P2k+1)…(Pn-1,Pn) ,其中,k<(n+1)/2且为自然数,得到序列 , t=t+1, At= 。转②。
将A0,A1,…, An-2按先后顺序排成一个序列,将序列中的数字从左至右依次两两结合,组成一个赛程。
   2). 若n为偶数,先求出n+1的赛程,而后将与n+1有关的场次去掉,得到的赛程即为所求。
并证明了此算法达到了上限值。
证明:1). 当n为奇数时
对任意的-1<t<n-2,且为偶数,设At= ,其中1< <n+1,  ( 1<i,j<n+1,且 ), 表示 与 的比赛,下同。做算法的第②步变换,可以得到At+1= ,其中k=1,2,…,(n-5)/2。由此变换,易知1, 的场次间隔分别为(n-1)/2-1;  , 的场次间隔分别为(n-1)/2;  ,k=2,…(n-1)/2(其余下标为偶数的班级)的场次间隔分别为(n-1)/2-1; ,k=1,…(n-5)/2(其余下标为奇数的班级)的场次间隔分别为(n-1)/2.
所以这两个序列并起来,将序列中的数字从左至右依次两两结合进行比赛,每队比赛最小场次间隔为(n-1)/2-1。
对任意的-1<t<n-2,且为奇数,设At= ,做算法的第④步变换,可以得到At+1= ,,其中k=1,2,…,(n-3)/2。由此变换,易知1, 的场次间隔分别为(n-1)/2;  , 的场次间隔分别为(n-1)/2-1;  ,k=2,…(n-1)/2(其余下标为奇数的班级)的场次间隔分别为(n-1)/2-1; ,k=1,…(n-5)/2(其余下标为偶数的班级)的场次间隔分别为(n-1)/2.
所以这两个序列并起来,将序列中的数字从左至右依次两两结合进行比赛,每队比赛最小场次间隔为(n-1)/2-1。
综上所述,当n为奇数时,各队的最小场次间隔为(n-1)/2-1.
2) 若n为偶数,先求出n+1的赛程,由上面可知n+1个队的最小场次间隔为n/2-1,现在只要求出n个队的最小场次间隔数为n+1个队的最小场次间隔数减1。对于(1)中求出的比赛场次顺序,将与n+1比赛的队伍轮空,即为偶数各队情况下的比赛场次顺序。对剩余的任意队i. 若两个i中间只去掉一个n+1队的比赛场此,则此时最小间隔为n/2-1-1.若两个i中间有多于1个n+1,如当有2个n+1时,则此2个n+1最小间隔为n/2-1,因此此两个I中间最小间隔为n/2-1+2.去掉此n+1两个队后,最小间隔为n/2-1,同样满足结论。
6.3.2 扩充的轮转模型2,其赛程编制过程如下:
当n为偶数时,可采用现实中常用的逆时针轮转法来编制赛程。

#28


但当n为奇数时,首先将参数队分为奇偶两组,自上而下,然后用横线把相对的两个号数相连,这就是第一轮比赛,此时最后一个奇队轮空。决定以后各轮比赛的方法是:把一号位置固定不变且偶轮时1在当前轮中轮空,因为要和上一轮的轮空配成比赛。奇轮中1则不轮空,然后由奇轮到偶轮逆时针轮转,由偶轮到奇轮时第一组不变,第二组上移一个位置,使得第一组最后一队轮空,轮转次数为n-2。如当n=7时,其赛程编制如下:
(1, 2) 1     (1, 4) 1 (1, 6) 1
(3, 4) (2, 4) (2, 6) (4, 6) (4, 7) (6, 7)
(5, 6) (3, 6) (3, 7) (2, 7) (2, 5) (4, 5)
7 (5, 7) 5 (3, 5) 3 (2, 3)
按自上而下自左而右顺序即得赛程。可证明此算法达到了上限值
证明:当n为偶数时,由问题二的解可知,n 支球队参加比赛时,每两场比赛中间相隔场次数为的上限为[(n-3)/2],相对于偶数来说就等于(n-4)/2。因为每一轮的比赛次数为比赛场和总轮数之比即为n(n-1)/2/(n-1)=n/2。又本文中的逆时针中1号位置固定,那么1号的间隔恒为n/2-1,可达到上限值。
那么其它球队最多只移1个位置那么相隔场次数最小为n/2-1-1=(n-4)/2,同样可达到上限优值。
当n为奇数时,其上限为:[(n-3)/2] =(n-3)/2,每一轮的比赛次数为比赛场和总轮数之比即为n(n-1)/2/n=(n-1)/2。同样算法中1号位置固定,那么相隔次数为(n-1)/2-1=(n-3)/2,刚好达到上限值。又每相邻两轮的轮空构成一场新的比赛,那么其它球队最多移动1个位置。即相隔次数最小为(n-3)-1+1=(n-3)/2也能达到上限值。
6.3.3 在达到第二问的上限的条件下,可通过扩充的轮转模型1求得当n=8和n=9的赛程结果为:
n=8时,其赛程安排如下(从左至右):
(1,2)、(3,4)、(5,6)、(7,8)、(2,4)、(3,6)、(5,8)、(1,4)、(2,6)、(3,8)、(7,1)、(4,6)、  (2,8)、(5,7)、(1,6)、(4,8)、(3,7)、(5,1)、(6,8)、(2,7)、(3,5)、(1,8)、(4,7)、(2,5)、   (3,1)、(6,7)、(4,5)、(2,3)   
程序略。
n=9时,其赛程安排如下(从左至右):
(1,2)、(3,4)、(5,6)、(7,8)、(9,1)、(2,4)、(3,6)、(5,8)、(7,9)、(1,4)、(2,6)、(3,8)、(5,9)、(7,1)、(4,6)、(2,8)、(3,9)、(5,7)、(1,6)、(4,8)、(2,9)、(3,7)、(5,1)、(6,8)、(4,9)、(2,7)、(3,5)、(1,8)、(6,9)、(4,7)、(2,5)、(3,1)、(8,9)、(6,7)、(4,5)、 (2,3)
程序略。  
还可通过扩充的轮转模型2得到:
n=8时,其赛程安排如下(从左至右):
(1,8)、(2,7)、(3,6)、(4,5)、(1,7)、(8,6)、(2,5)、(3,4)、(1,6)、(7,5)、  (8,4)、(2,3)、(1,5)、(6,4)、(7,3)、(8,2)、(1,4)、(5,3)、(6,2)、(7,8)、 (1,3)、(4,2)、(5,8)、(6,7)、(1,2)、(3,8)、(4,7)、(5,6)
程序略。
n=9时,其赛程安排如下(从左至右):
(1,2)、(3,4)、(5,6)、(7,8)、(9,1)、( 2,4)、(3,6)、(5,8)、(7,9)、(1,4)、(2,6)、(3,8)、(5,9)、(7,1)、(4,6)、(2,8)、(3,9)、(5,7)、(1,6)、(4,8)、(2,9)、(3,7)、(5,1)、(6,8)、(4,9)、(2,7)、(3,5)、(1,8)、( 6,9)、(4,7)、(2,5)、(3,1)、(8,9)、(6,7)、(4,5)、(2,3)
通过验证这两种扩充的轮转模型得到的赛程都是满足条件的。
6.4 问题4的求解
基于问题3,得到表1和表2
表1 N=8时每两场比赛间隔相隔场次数
队号 扩充的轮转模型1 扩充的轮转模型2
12345678 6  2  3  2  3  23  3  3  6  3  33  3  6  3  3  22  2  3  3  6  33  6  3  2  2  22  2  2  2  3  66  2  2  2  2  22  2  2  2  2  2 3  3  3  3  3  34  4  3  2  2  24  3  2  2  2  43  2  2  2  4  42  2  2  4  4  42  2  4  4  4  32  4  4  4  3  24  4  4  3  2  2

表2  N=9时每两场比赛间隔相隔场次数
队号 扩充的轮转模型1 扩充的轮转模型2
1 3  4  3  4  3  4  3 3  4  3  4  3  4  3
2 4  4  4  4  4  4  4 4  4  4  4  4  4  4
3 4  4  4  4  4  4  3 4  4  4  4  4  4  3
4 3  3  4  4  4  4  4 3  3  4  4  4  4  4
5 4  4  4  4  3  3  3 4  4  4  4  3  3  3
6 3  3  3  3  4  4  4 3  3  3  3  4  4  4
7 4  4  3  3  3  3  3 4  4  3  3  3  3  3
8 3  3  3  3  3  3  4 3  3  3  3  3  3  4
9 3  3  3  3  3  3  3 3  3  3  3  3  3  3
我们已经考虑过每两场比赛间相邻场次数这一指标,指的是在达到上限值的前提下,每两场比赛间相隔场次数越大,说明这个赛程越优,由于要保证足够长的休整时间,所以所有球队的总的间隔应尽可能大,方差是恒量某组事物中各个事物的实际与这平均值的偏差情况,由于题目要求对每个球队尽量公平,所以每个球队的总间隔应可能相等。又考虑到更有利于发挥球队的水平,考虑到每个球队的间隔数的方差应尽可能小,恒量方差是某组事物中各个事物的实际与这平均值的偏差情况。通过计算得到当n=8,9的具体情况如下:
表3 每个球队的间隔数的方差为:
队号(n=8) 扩充的轮转模型1的方差 扩充的轮转模型2的方差 队号(n=9) 扩充的轮转模型1的方差 扩充的轮转模型2的方差
1 2.00 0.00 1 0.25 0.25
2 3.75 0.81 2 0.00 0.00
3 1.56 0.81 3 0.12 0.12
4 1.63 0.81 4 0.20 0.20
5 2.00 1.00 5 0.27 0.27
6 2.14 0.81 6 0.25 0.25
7 2.22 0.81 7 0.20 0.20
8 0.00 0.81 8 0.12 0.12
9 0.00 0.00
整个赛程的总间隔方差 0.03 0.08 0.01 0.01
n=8时
扩充的轮转模型1:所有球队的总的间隔数为:141
                     每个球队的总的间隔数分别为:18  21  20  19  18  17  16  12
   扩充的轮转模型2:所有球队的总的间隔数为:144
                     每个球队的总的间隔数分别为:18  17  17  17  18  19  19  19 
n=9时
扩充的轮转模型1:所有球队的总的间隔数为:221
                     每个球队的总的间隔数分别为:24  28  27  26  26  24  23  22  21 
扩充的轮转模型2同扩充的轮转模型1。 
通过表3比较,当n=8时,第二种扩充的轮转模型较好,当n=9时,两种扩充的轮转模型等价。

//全文完,相信这篇论文可以给楼主一些帮助,这篇论文可是获得过2002年大学生数学建模竞赛全国一等奖。:)

#29


佩服—>楼上的
受不了—>楼上的

#1


用什么编呀?

#2


这是我一个同学问我的,我也不清楚用什么语言。我猜可能 是C或者是VB ,大哥帮我一下吧
 谢了

#3


这个是离散里的数理逻辑那部分的题目啊,好熟

#4


不会

#5


制表我不知道怎么做,不过我可以试试自己的办法。

main()
{int n,i,j,k,t;  
       /*n由题目决定具体数值*/
       /*i为天数(即第i天)*/
       /*j为赛事(某天的第j场赛事)*/
       /*k,t为队的编号(即k队 vs t对)*/
 for(i=1;i<=n-1;i++)
 for(k=1;k<=n;k++)
  if(k) 
    for(t=1;t<=n;t++)
    while(t=k) break;
  for(j=1;j<=n/2;j++)
   {
       printf("Day%d\n",i);
       printf("\t  Team_A  Team_B\n");
       printf("Match%2d %8d  %8d\n",j,k,t);
    }
  printf("\n");
}


#6


修改一下:

main()
{int n,i,j,k,t;  
       /*n由题目决定具体数值*/
       /*i为天数(即第i天)*/
       /*j为赛事(某天的第j场赛事)*/
       /*k,t为队的编号(即k队 vs t对)*/
 for(i=1;i<=n-1;i++)
 {for(k=1;k<=n;k++)
  if(k) 
    for(t=1;t<=n;t++)
    while(t==k) break;
  for(j=1;j<=n/2;j++)
   {
       printf("Day%d\n",i);
       printf("\t  Team_A  Team_B\n");
       printf("Match%2d %8d  %8d\n",j,k,t);
    }
  }
  printf("\n");
}


我机子的键盘有点问题,在tc中“ \”这个符号打不出来,所以没有调试,不好意思啊1

#7


一道编程题;n个球队进行循环赛 但每队每天只能出场一次,现排一个赛事,使得循环赛在最短时间内完成。n为 偶数 每天有n/2场比赛 历时n-1天 结果用表格形势
把楼主的题实例化:
设有6个队进行循环赛,但每队每天只能出场一次,现排一个赛事,使得循环赛在最短时间内完成,每天有3场比赛。5天比赛完。则可能的循环赛对组为(设队号为1-6)
1-2,1-3,1-4,1-5,1-6,2-3,2-4,2-5,2-6,3-4,3-5,3-6,4-5,4-6,5-6共15组,实际就是C(2  6).
手工列出比赛日程:
第一天:1-2 3-4 5-6
第二天:1-3 2-5 4-6
第三天:1-4 2-6 3-5
第四天:1-5 2-4 3-6
第五天:1-6 2-3 4-5
不知还有没有别的排法。且我没看出规律来能编程实现,抛砖引玉吧。

#8


to hillyee(山之笛):
上机结果错误。

#9


楼主,你要先弄清思路!向bigtea(企鹅)一样!

#10


to:bigtea(企鹅)

我上机调试的时候因为有个符号打不出来,所以也不知道是什么地方的错误。
你可以说的清楚点吗?

还有就是语句中的break语句,我没什么把握,也许应该是continue语句更好点。

#11


既然n只队伍,每天n/2只队伍比赛,n-1天赛完,我不知道求什么最短时间?难道不是一句这个吗?每天有n/2场比赛 历时n-1天,所以我觉得这个题好像用程序来实现,我觉得没有什么意义,就像前面的那位老兄说的,就是排列组合嘛,所需要的就是打印,这就是这个程序最主要的工作了,至于最短时间,我实在不知道什么意思,哪位明白再讲讲吧!!!!!

#12


to:楼主

我说说的解题思路吧:
①在每一天里,安排赛事,例如第一队(既是k=1)和对二队(既是t=2)比赛。首先是第一队和其他的n-1个队的比赛,分配在每一天里就可以了,只要保证(k<t),这样就可以保证比赛不会重复,用for(k=1;k<=n;k++)当第一队时和其他队比赛。
②用for(i=1;i<=n-1;i++)来循环每天,从第一天到到最后一天。
③就是制表了,表里面的线我不会,不过格式倒是可以搞出来,就像上面那样就可以了。


*****大家讨论一下,共同提高*****

#13


循环赛在最短时间内完成,与历时n-1天 ,矛盾吗??

#14


循环赛在最短时间内完成,与历时n-1天 ,不矛盾吗??

#15


如果历时n-1天 
同意 hillyee(山之笛)

#16


同意liuhaibao(网络人生)兄,这个本来就不是求什么最优解的程序,不过用计算机给出一种排法在打印出来.不是很有挑战性..

#17


是啊,我觉得题目还是有问题,山笛的想法我看了,你只是按照n-1天的将比赛安排了一下,你怎么能证明n-1天是最短的时间呢?

#18


如果按照题意思,比赛一定是在n-1内完成的,所以这句话根本就没有什么意义。真的没有必要深究的!

#19


main()
{   
  int n,i,j,k,t; 
  for(k=1,j=1;k<=n&&j<=n/2;k++,j++)
  for(t=2;t>k&&t<=n;t++)
  for(i=1;i<=n-1;i++)  
   {   printf("Day%d\n",i);
       printf("\t  Team_A  Team_B\n");
       printf("Match%2d %8d  %8d\n",j,k,t);
    }
 
  printf("\n");
}

请有兴趣的朋友们帮我运行一下,应该已经可以了1

#20


真是非常感谢大家呀 有这么多热心的朋友,我真的好感动 

#21


To:hillyee(山之笛)
我运行了,但是结果还是不对

你的结果为:
Day1
  Team_A  Team_B
Match 1        1         2
Day2
  Team_A  Team_B
Match 1        1         2
Day3
  Team_A  Team_B
Match 1        1         2
Day4
  Team_A  Team_B
Match 1        1         2
Day5
  Team_A  Team_B
Match 1        1         2
Day6
  Team_A  Team_B
Match 1        1         2
Day7
  Team_A  Team_B
Match 1        1         2
Day1
  Team_A  Team_B
Match 1        1         3
Day2
  Team_A  Team_B
Match 1        1         3
Day3
  Team_A  Team_B
Match 1        1         3
Day4
  Team_A  Team_B
Match 1        1         3
Day5
  Team_A  Team_B
Match 1        1         3
Day6
  Team_A  Team_B
Match 1        1         3
Day7
  Team_A  Team_B
Match 1        1         3
Day1
  Team_A  Team_B
Match 1        1         4
Day2
  Team_A  Team_B
Match 1        1         4
Day3
  Team_A  Team_B
Match 1        1         4
Day4
  Team_A  Team_B
Match 1        1         4
Day5
  Team_A  Team_B
Match 1        1         4
Day6
  Team_A  Team_B
Match 1        1         4
Day7
  Team_A  Team_B
Match 1        1         4
Day1
  Team_A  Team_B
Match 1        1         5
Day2
  Team_A  Team_B
Match 1        1         5
Day3
  Team_A  Team_B
Match 1        1         5
Day4
  Team_A  Team_B
Match 1        1         5
Day5
  Team_A  Team_B
Match 1        1         5
Day6
  Team_A  Team_B
Match 1        1         5
Day7
  Team_A  Team_B
Match 1        1         5
Day1
  Team_A  Team_B
Match 1        1         6
Day2
  Team_A  Team_B
Match 1        1         6
Day3
  Team_A  Team_B
Match 1        1         6
Day4
  Team_A  Team_B
Match 1        1         6
Day5
  Team_A  Team_B
Match 1        1         6
Day6
  Team_A  Team_B
Match 1        1         6
Day7
  Team_A  Team_B
Match 1        1         6
Day1
  Team_A  Team_B
Match 1        1         7
Day2
  Team_A  Team_B
Match 1        1         7
Day3
  Team_A  Team_B
Match 1        1         7
Day4
  Team_A  Team_B
Match 1        1         7
Day5
  Team_A  Team_B
Match 1        1         7
Day6
  Team_A  Team_B
Match 1        1         7
Day7
  Team_A  Team_B
Match 1        1         7
Day1
  Team_A  Team_B
Match 1        1         8
Day2
  Team_A  Team_B
Match 1        1         8
Day3
  Team_A  Team_B
Match 1        1         8
Day4
  Team_A  Team_B
Match 1        1         8
Day5
  Team_A  Team_B
Match 1        1         8
Day6
  Team_A  Team_B
Match 1        1         8
Day7
  Team_A  Team_B
Match 1        1         8

#22


这道题的算法是关键。
先说各位的算法吧,得法出来了,自然易编程。

#23


可以考虑用轮转法来做。

#24


抱歉,让大家失望了!

#25


我是一个新手对c还不是很熟;
但可以肯定的是:最短肯定是 n-1天
因为是循环赛;每一个队要跟所有队比完,即要有(N-1)队

#26


/ teamMatching.cpp : Defines the entry point for the console application.
// destrition ; n个球队进行循环赛  但每队每天只能出场一次,现排一个赛事
//           使得循环赛在最短时间内完成。n为 偶数 每天有n/2场比赛 历时n-1天
// creator        ; XJUNP 29/5

#include "stdafx.h"
#include <iostream.h>

int _tmain(int argc, _TCHAR* argv[])
{
int num, team1, team2, day;
cout << " please input the team numer :  ";
cin >> num ;
cout << endl;

for (day=1;day <= num-1; day++)
{                                     
                   //???这儿如何控制每天输出                             
for (team1=1; team1<=num; team1++)
{
for (team2=2; team2<=num; team2++)
{
if (team1==team2)
break;
cout << "team1 :\t" << team1 << "\t"
     << "team2 :\t" << team2 << "\t" << endl;
}
}
}
return 0;
}


请高手解疑!

#27


赛程安排的优化设计 

(邵阳学院计算机系,湖南邵阳,422000)

摘要:本文假设多支球队在同一场地进行单循环赛,根据公平合理的原则,使各队每两场相邻比赛中间得到尽量多的较为均等休整时间,建立了轮转法模型及其扩充来安排赛程。首先对于5支球队的比赛,给出了一个各队每两场比赛中间都至少相隔一场的赛程, 然后证明了当n 支球队比赛时,各队每两场比赛中间相隔的场次数的上限是[(n-3)/2],在达到以上上限的条件下,利用轮转模型及其扩充编制了n=8和n=9的赛程,并编程实现。最后给出了衡量一个赛程优劣的其它指标,如总间隔数、平均间隔数、间隔数方差等,同时说明了以上所给赛程达到这些指标的程度。
关键字:单循环赛,尽量公平,轮转法及其扩充,上限 

1 问题的提出
假设多支球队在同一场地进行单循环赛,为公平合理,使各队每两场相邻比赛中间得到尽量多的较为均等休整时间,如何安排赛程呢?针对这一现实问题,提出了如下问题:
1) 对于5支球队的比赛, 给出一个各队每两场比赛中间都至少相隔一场的赛程。
2) 当n支球队比赛时, 各队每两场比赛中间相隔的场次数的上限是多少。
3) 在达到2) 的上限的条件下, 给出n=8, n=9的赛程, 并说明它们的编制过程。
4) 除了每两场比赛间相隔场次数这一指标外, 你还能给出哪些指标来衡量一个赛程的优劣, 并说明3) 中给出的赛程达到这些指标的程度。

2 基本假设
1) 每支球队在同一块场地上进行单循环赛。
2) 参赛队数有限。
3) 整个赛程是持续的,不考虑天气等意外事故,且赛程时间足够长。
4) 无任何队在赛程间中途弃权。
5) 一般仅考虑用每相邻两场比赛间隔这一指标来衡量赛程的优劣。

3 符号约定
    [n]:不大于取整,其结果为不大于n的最大整数。
    (m,n):表示m和n的一场比赛,其中m和n分别表示球队的签号。

4 基本概念及定义
单循环赛:也称单循环制,循环赛的一种,各比赛队之间相互轮赛一次。较多采用胜一场得2或3分,平一场各得1分,负一场得0分的计分方法。评定名次的办法一般采用按积分多少决定名次;如遇两队或两队以上积分相等时,则按积分相等的队在同一循环全部比赛中的净胜球、进球数的顺序决定名次,多者名次列前;如仍相等,则抽签决定名次。根据比赛的性质、任务,为了达到某种目的,计分与决定名次的办法可以有所变化,但必须在竞赛规程中作出具体明确的规定。总比赛场数= 。规定每轮中每队尽可能地参加比赛,但每队不得超过一场,可有轮空,故总比赛轮数,当参加队数是奇数时为:参加队数,若参加队数是偶数时为:参加队数-1。

上限:所有赛程安排方案中,任意方案中任意队的相邻两场比赛间隔的最小间隔的最大值。

5模型的建立及其合理性的分析
单循环赛中,在编排竞赛日程时应客观公正,合理安排各队的比赛场地和时间,赛后须有一定的休息时间,以保障运动员的健康与技术水平的发挥(全国甲级队比赛不 少于36小时,世界杯足球赛不少于48小时)。根据现实经验,并归纳分析,我们建立了轮转法及其扩充模型。
现实中竟赛编排一般采用逆时针轮转法列出赛程。
所谓逆时针轮转法,首先将参赛队数平均分为两半(参赛队为奇数时,可以 在后面加一个零号,使之成为双数),前一半自上而下列在左边, 后一半自下而上列在右边,然后用横线把相对的两个号数相连, 这就是第一轮的比赛。确定以后各轮比赛的方法是:把1号位 置固定不动,其余号数按逆时针方向轮换位置,每轮换一次就是一轮比赛。参加队数为奇数时,凡遇0号的队即为轮空。经抽签,各队对号定位,由此列出竞赛日程表。相应有顺时针轮转法。
为保证各队每两场相邻比赛中间得到尽量多的较为均等休整时间,可证明本模型对参赛队为偶数时,是最优模型之一。但对参赛队为奇数时,逆时针轮转法已不能保证各队每两场相邻比赛中间得到尽量多的较为均等的休整时间,因此我们提出了扩充的轮转法。所谓扩充的轮转法指的是每相邻两轮比赛中,所有队出场次序最多逆时针或顺时针移动一个位置。

6 问题的求解
6.1 问题1的求解及算法
利用穷举法较易求得其中一个合理的赛程为:
(1, 2)、(3, 4)、(5, 1)、(2,4)、(3,5)、(1,4)、(2,5)、(3,1)、(4,5)、(2,3)
较易看出各队每两场比赛中间都至少相隔一场。
6.2 问题2的求解及证明
当n支球队比赛时,各队每两场比赛中间隔的场次数的上限为[(n-3)/2]。
证明:有n支队伍,对任意一支队伍k , 设其相邻的两场比赛为 (k,i), (k,j),中间间隔p场比赛。现在即求p的上限值。由于此两场比赛已有k , i , j 参加,为达到间隔上限,中间p场比赛中不能出现此三支队伍,即还剩下n-3支队伍,且此n-3支队伍在p场比赛中最多只能出现一次。当n为奇数时,n-3为偶数,则p最多即为(n-3)/2场(此时(n-3)/2=[(n-3)/2])。当n为偶数时,n-3为奇数,则有一队要轮空,即p最多则为(n-3-1)/2场(此时(n-3-1)/2=[(n-3)/2])。综上所述,各队两场比赛中间隔的场次数的上限为[(n-3)/2]。
6.3 问题3的求解及算法
6.3.1 对于一般的n,我们定义如下扩充的轮转模型1,其赛程编制过程如下:
   1). 若n为奇数,
   ①. 置初值。A0={1,2,3,4,5,6,…,n}, t=0.
  ②.对At做(P3,P4) …(P2k+1,P2k+2)…(Pn-2,Pn-1) ,其中,(Pi,Pj)表示将第i位置的数与第j位置的数交换,下同,k<(n-1)/2且为自然数。得到序列 , t=t+1,At= 。
   ③. 如果t>=n-2, 结束,否则,继续向下做。
   ④. 对At做(P2,P3) …(P2k,P2k+1)…(Pn-1,Pn) ,其中,k<(n+1)/2且为自然数,得到序列 , t=t+1, At= 。转②。
将A0,A1,…, An-2按先后顺序排成一个序列,将序列中的数字从左至右依次两两结合,组成一个赛程。
   2). 若n为偶数,先求出n+1的赛程,而后将与n+1有关的场次去掉,得到的赛程即为所求。
并证明了此算法达到了上限值。
证明:1). 当n为奇数时
对任意的-1<t<n-2,且为偶数,设At= ,其中1< <n+1,  ( 1<i,j<n+1,且 ), 表示 与 的比赛,下同。做算法的第②步变换,可以得到At+1= ,其中k=1,2,…,(n-5)/2。由此变换,易知1, 的场次间隔分别为(n-1)/2-1;  , 的场次间隔分别为(n-1)/2;  ,k=2,…(n-1)/2(其余下标为偶数的班级)的场次间隔分别为(n-1)/2-1; ,k=1,…(n-5)/2(其余下标为奇数的班级)的场次间隔分别为(n-1)/2.
所以这两个序列并起来,将序列中的数字从左至右依次两两结合进行比赛,每队比赛最小场次间隔为(n-1)/2-1。
对任意的-1<t<n-2,且为奇数,设At= ,做算法的第④步变换,可以得到At+1= ,,其中k=1,2,…,(n-3)/2。由此变换,易知1, 的场次间隔分别为(n-1)/2;  , 的场次间隔分别为(n-1)/2-1;  ,k=2,…(n-1)/2(其余下标为奇数的班级)的场次间隔分别为(n-1)/2-1; ,k=1,…(n-5)/2(其余下标为偶数的班级)的场次间隔分别为(n-1)/2.
所以这两个序列并起来,将序列中的数字从左至右依次两两结合进行比赛,每队比赛最小场次间隔为(n-1)/2-1。
综上所述,当n为奇数时,各队的最小场次间隔为(n-1)/2-1.
2) 若n为偶数,先求出n+1的赛程,由上面可知n+1个队的最小场次间隔为n/2-1,现在只要求出n个队的最小场次间隔数为n+1个队的最小场次间隔数减1。对于(1)中求出的比赛场次顺序,将与n+1比赛的队伍轮空,即为偶数各队情况下的比赛场次顺序。对剩余的任意队i. 若两个i中间只去掉一个n+1队的比赛场此,则此时最小间隔为n/2-1-1.若两个i中间有多于1个n+1,如当有2个n+1时,则此2个n+1最小间隔为n/2-1,因此此两个I中间最小间隔为n/2-1+2.去掉此n+1两个队后,最小间隔为n/2-1,同样满足结论。
6.3.2 扩充的轮转模型2,其赛程编制过程如下:
当n为偶数时,可采用现实中常用的逆时针轮转法来编制赛程。

#28


但当n为奇数时,首先将参数队分为奇偶两组,自上而下,然后用横线把相对的两个号数相连,这就是第一轮比赛,此时最后一个奇队轮空。决定以后各轮比赛的方法是:把一号位置固定不变且偶轮时1在当前轮中轮空,因为要和上一轮的轮空配成比赛。奇轮中1则不轮空,然后由奇轮到偶轮逆时针轮转,由偶轮到奇轮时第一组不变,第二组上移一个位置,使得第一组最后一队轮空,轮转次数为n-2。如当n=7时,其赛程编制如下:
(1, 2) 1     (1, 4) 1 (1, 6) 1
(3, 4) (2, 4) (2, 6) (4, 6) (4, 7) (6, 7)
(5, 6) (3, 6) (3, 7) (2, 7) (2, 5) (4, 5)
7 (5, 7) 5 (3, 5) 3 (2, 3)
按自上而下自左而右顺序即得赛程。可证明此算法达到了上限值
证明:当n为偶数时,由问题二的解可知,n 支球队参加比赛时,每两场比赛中间相隔场次数为的上限为[(n-3)/2],相对于偶数来说就等于(n-4)/2。因为每一轮的比赛次数为比赛场和总轮数之比即为n(n-1)/2/(n-1)=n/2。又本文中的逆时针中1号位置固定,那么1号的间隔恒为n/2-1,可达到上限值。
那么其它球队最多只移1个位置那么相隔场次数最小为n/2-1-1=(n-4)/2,同样可达到上限优值。
当n为奇数时,其上限为:[(n-3)/2] =(n-3)/2,每一轮的比赛次数为比赛场和总轮数之比即为n(n-1)/2/n=(n-1)/2。同样算法中1号位置固定,那么相隔次数为(n-1)/2-1=(n-3)/2,刚好达到上限值。又每相邻两轮的轮空构成一场新的比赛,那么其它球队最多移动1个位置。即相隔次数最小为(n-3)-1+1=(n-3)/2也能达到上限值。
6.3.3 在达到第二问的上限的条件下,可通过扩充的轮转模型1求得当n=8和n=9的赛程结果为:
n=8时,其赛程安排如下(从左至右):
(1,2)、(3,4)、(5,6)、(7,8)、(2,4)、(3,6)、(5,8)、(1,4)、(2,6)、(3,8)、(7,1)、(4,6)、  (2,8)、(5,7)、(1,6)、(4,8)、(3,7)、(5,1)、(6,8)、(2,7)、(3,5)、(1,8)、(4,7)、(2,5)、   (3,1)、(6,7)、(4,5)、(2,3)   
程序略。
n=9时,其赛程安排如下(从左至右):
(1,2)、(3,4)、(5,6)、(7,8)、(9,1)、(2,4)、(3,6)、(5,8)、(7,9)、(1,4)、(2,6)、(3,8)、(5,9)、(7,1)、(4,6)、(2,8)、(3,9)、(5,7)、(1,6)、(4,8)、(2,9)、(3,7)、(5,1)、(6,8)、(4,9)、(2,7)、(3,5)、(1,8)、(6,9)、(4,7)、(2,5)、(3,1)、(8,9)、(6,7)、(4,5)、 (2,3)
程序略。  
还可通过扩充的轮转模型2得到:
n=8时,其赛程安排如下(从左至右):
(1,8)、(2,7)、(3,6)、(4,5)、(1,7)、(8,6)、(2,5)、(3,4)、(1,6)、(7,5)、  (8,4)、(2,3)、(1,5)、(6,4)、(7,3)、(8,2)、(1,4)、(5,3)、(6,2)、(7,8)、 (1,3)、(4,2)、(5,8)、(6,7)、(1,2)、(3,8)、(4,7)、(5,6)
程序略。
n=9时,其赛程安排如下(从左至右):
(1,2)、(3,4)、(5,6)、(7,8)、(9,1)、( 2,4)、(3,6)、(5,8)、(7,9)、(1,4)、(2,6)、(3,8)、(5,9)、(7,1)、(4,6)、(2,8)、(3,9)、(5,7)、(1,6)、(4,8)、(2,9)、(3,7)、(5,1)、(6,8)、(4,9)、(2,7)、(3,5)、(1,8)、( 6,9)、(4,7)、(2,5)、(3,1)、(8,9)、(6,7)、(4,5)、(2,3)
通过验证这两种扩充的轮转模型得到的赛程都是满足条件的。
6.4 问题4的求解
基于问题3,得到表1和表2
表1 N=8时每两场比赛间隔相隔场次数
队号 扩充的轮转模型1 扩充的轮转模型2
12345678 6  2  3  2  3  23  3  3  6  3  33  3  6  3  3  22  2  3  3  6  33  6  3  2  2  22  2  2  2  3  66  2  2  2  2  22  2  2  2  2  2 3  3  3  3  3  34  4  3  2  2  24  3  2  2  2  43  2  2  2  4  42  2  2  4  4  42  2  4  4  4  32  4  4  4  3  24  4  4  3  2  2

表2  N=9时每两场比赛间隔相隔场次数
队号 扩充的轮转模型1 扩充的轮转模型2
1 3  4  3  4  3  4  3 3  4  3  4  3  4  3
2 4  4  4  4  4  4  4 4  4  4  4  4  4  4
3 4  4  4  4  4  4  3 4  4  4  4  4  4  3
4 3  3  4  4  4  4  4 3  3  4  4  4  4  4
5 4  4  4  4  3  3  3 4  4  4  4  3  3  3
6 3  3  3  3  4  4  4 3  3  3  3  4  4  4
7 4  4  3  3  3  3  3 4  4  3  3  3  3  3
8 3  3  3  3  3  3  4 3  3  3  3  3  3  4
9 3  3  3  3  3  3  3 3  3  3  3  3  3  3
我们已经考虑过每两场比赛间相邻场次数这一指标,指的是在达到上限值的前提下,每两场比赛间相隔场次数越大,说明这个赛程越优,由于要保证足够长的休整时间,所以所有球队的总的间隔应尽可能大,方差是恒量某组事物中各个事物的实际与这平均值的偏差情况,由于题目要求对每个球队尽量公平,所以每个球队的总间隔应可能相等。又考虑到更有利于发挥球队的水平,考虑到每个球队的间隔数的方差应尽可能小,恒量方差是某组事物中各个事物的实际与这平均值的偏差情况。通过计算得到当n=8,9的具体情况如下:
表3 每个球队的间隔数的方差为:
队号(n=8) 扩充的轮转模型1的方差 扩充的轮转模型2的方差 队号(n=9) 扩充的轮转模型1的方差 扩充的轮转模型2的方差
1 2.00 0.00 1 0.25 0.25
2 3.75 0.81 2 0.00 0.00
3 1.56 0.81 3 0.12 0.12
4 1.63 0.81 4 0.20 0.20
5 2.00 1.00 5 0.27 0.27
6 2.14 0.81 6 0.25 0.25
7 2.22 0.81 7 0.20 0.20
8 0.00 0.81 8 0.12 0.12
9 0.00 0.00
整个赛程的总间隔方差 0.03 0.08 0.01 0.01
n=8时
扩充的轮转模型1:所有球队的总的间隔数为:141
                     每个球队的总的间隔数分别为:18  21  20  19  18  17  16  12
   扩充的轮转模型2:所有球队的总的间隔数为:144
                     每个球队的总的间隔数分别为:18  17  17  17  18  19  19  19 
n=9时
扩充的轮转模型1:所有球队的总的间隔数为:221
                     每个球队的总的间隔数分别为:24  28  27  26  26  24  23  22  21 
扩充的轮转模型2同扩充的轮转模型1。 
通过表3比较,当n=8时,第二种扩充的轮转模型较好,当n=9时,两种扩充的轮转模型等价。

//全文完,相信这篇论文可以给楼主一些帮助,这篇论文可是获得过2002年大学生数学建模竞赛全国一等奖。:)

#29


佩服—>楼上的
受不了—>楼上的