分治思想:乒乓球比赛日程安排
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:某学校举行乒乓球比赛,在初赛时采用循环赛,设有n位选手参赛,初赛共进行n-1天,每位选手与其他每一位选手进行一场比赛,然后按照积分进行选拔进入决赛的选手。
根据学校作息时间,要求每位选手每天必须进行一场比赛,不能轮空。
按此要求为比赛安排具体日程,即决定每天各选手的对阵情况。
解题思路:可考虑使用分治思想来建华日程的安排,按照分治策略,可以将所有的参赛选手分为两半,则n个选手的比赛日程就可以通过n/2个选手的比赛日程表来决定。
继续用这种一分为二的方法对选手们进行划分,直到只剩下2位选手时情况就很简单了。
实验代码:
#define MAXN 64
int a[MAXN][MAXN]={0};
void gamecal(int k,int n) //deal from k--k+n
{
int i,j;
if(n==2)
{
a[k][1]=k; //host
a[k][2]=k+1; //vip
a[k+1][1]=k+1; //host
a[k+1][2]=k; //vip
}
else
{
gamecal(k,n/2);
gamecal(k+n/2,n/2);
for(i=k;i<k+n/2;i++)
{
for(j=n/2+1;j<=n;j++)
a[i][j]=a[i+n/2][j-n/2];
}
for(i=k+n/2;i<k+n;i++)
{
for(j=n/2+1;j<=n;j++)
a[i][j]=a[i-n/2][j-n/2];
}
}
}
int main()
{
int m,i,j;
cout<<"please input the player number: ";
cin>>m;
j=2;
for(i=2;i<8;i++)
{
j=j*2;
if(j==m)
break;
}
if(i>=8)
{
cout<<"the player number must be pow(2,n),and smaller than 65 !"<<endl;
return 0;
}
gamecal(1,m);
cout<<"Num: ";
for(i=1;i<m;i++)
cout<<i<<"d ";
cout<<endl;
for(i=1;i<=m;i++)
{
cout<<" ";
for(j=1;j<=m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}。