比赛安排分析和总结.docxVIP

  • 10
  • 0
  • 约1.77千字
  • 约 2页
  • 2024-01-24 发布于湖北
  • 举报

【题01】比赛安排

有n(n为偶数)个球队要进行友谊赛,要求每一队必须和所有其它队交锋一次。在安排赛事时为了照顾参赛队的休息,一天赛事中同一球队不允许进行两场比赛。问要在最短天数内安排完比赛,该如何设计程序。输入:

n

输出:

最短天数k

以下k行为每天交锋的两队序号

题解

n

我们每天设2场次,让每个队出场一次,显然,为了使每个队与其余队交锋一次,比赛天数定为n-1。

n

这样的安排即不违反规则,又能在最短时间内安排完比赛。例如n=4时,每天有2=2场,共进行n-1=3

天比赛:

第一天

1队与2队

3队与4队

第二天

1队与3队

2队与4队

第三天

1队与4队

2队与3队

设第i天的比赛为x队对奕y队。由于任何数除以n-1的余数有n-1个(0,1,…,n-2),与比赛天数相同,因此x、y与可以呈如下对应关系:

(x+y)mod(n-1)=i

表明第i+1天的一场比赛为x:y或者y:x。

我们不妨依次枚举第i+1天交锋的一支球队x为1,…,n。若x球队的序号一旦确定,则与之交锋的球队y按下式计算:

y=((n-1)+i-x)mod(n-1)

上述模数方程得出的y值与第i+1天参赛的y队序号比较,不仅多一个0,缺少n-1和n两个数,而且还可能出现x队相同的序号。为了使得模数方程得出的y值与y队的序号对应,我们不妨假设:

若y=0,则设定y=n-1;

若x=y,则设定y=n或者x=n,使得对垒阵局为n:x或者x:n。例如n=4时,同余关系如表9.1.1所示:

y

x

1

2

3

4

i=0(第一天)

2

1

4

3

i=1(第二天)

3

4

1

2

i=2(第三天)

4

3

2

1

表9.1.1

通过上述方法,我们将赛事安排对应一张同余表。设同余表A,其中

A[i,x]—第i天与x队交锋的球队序号(0≤i≤n-1,1≤x≤n)。同余表的计算过程如下:

fori←0ton-2do {依次计算每一天的比赛场次}

forx←1tondo {枚举x队的序号}

begin

y←((n-1)+i-x)mod(n-1); {计算第i+1天与x队交锋的y队序号}ify=0theny←n-1;

A[i,x]←y;

ifA[i,x]=xthenbeginA[i,x]←n;A[i,n]←x;end;{then}end;{for}

在同余表中,同一天里出现了x:y和y:x的对垒阵局,它们同属一个场次。我们不妨取xy的一组,使

n

得一天进行

2

场互不相交的比赛:

fori←0ton-2dobegin

输出第i+1天的比赛提示;

forx←1tondo ifxA[i,x]then输出x队与A[i,x]队交锋;end;{for}

如果题意稍作变化:n可为奇数时怎么办?显然,为了使每个队与其余队交锋一次,每天让每个队出

n

场一次,比赛天数定为n天,每天设2场次。我们通过下述方法计算比赛方案:

列模数方程

(x+y)modn=i (1≤i≤n-1)

由此得出

y=(n+i-x)modn

表明第i+1天的一场比赛为x:y或者y:x。我们不妨依次枚举第i+1天交锋的一支球队x为1,…,n。若x球队的序号一旦确定,则按照上式得出与之交锋的y队序号。由于n为奇数,1≤i≤n-1,因此x≠y。为了使得模数方程得出的y值对应球队序号,不妨假设y=0时,y确定为n。

fori←0ton-1doforx←1tondobegin

y←(i+n-x)modn;ify=0thenk←n;a[i,x]←y;end;{for}

fori←0ton-1dobegin

输出第i+1天的比赛提示;

forx←1tondo ifxA[i,x]then输出x队与A[i,x]队交锋;end;{for}

文档评论(0)

1亿VIP精品文档

相关文档