问题 H: 比赛安排
时间限制: 1 Sec 内存限制: 125 MB提交: 15 解决: 12
[ 提交][ 状态][ 讨论版][命题人: 外部导入]
题目描述
设有2n(n<=6)个球队进行单循环比赛,计划在2 n – 1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2n – 1天内每个队都与不同的对手比赛。
例如n=2时的比赛安排:
队 1 2 3 4
比赛 1==2 3==4 一天
1==3 2==4 二天
1==4 2==3 三天
输入
每个测试文件只包含一组测试数据,每组输入数据为一个正整数n(n<=6)。
输出
对于每组输入数据,输出比赛安排,从第一天的安排开始,每天占一行,每行开头先输出天号,再输出当天的安排,优先给队伍编号小的队伍安排比赛,具体格式见样例输出。
样例输入
2
样例输出
<1>1-2,3-4<2>1-3,2-4<3>1-4,2-3
题解:
is[i][j]记录i与j有没有比过,vis[i]记录当天i有没有比过,
每天都从i=1开始遍历vis[i],若i在当天还没有出现过,则
遍历is[i][j],取符合条件的最小j.
代码:
#include<bits/stdc++.h>
using namespace std;
bool is[505][505],vis[505];
int main()
{
int n;scanf("%d",&n);
memset(is,0,sizeof(is));
int T=(1<<n)-1,ans=0;
while(T--)
{
memset(vis,0,sizeof(vis));
printf("<%d>",++ans);
bool bb=0;
for(int i=1;i<=(1<<n);i++)
{
if(!vis[i])
{
vis[i]=1;
for(int j=i+1;j<=(1<<n);j++)
{
if(!vis[j]&&!is[i][j])
{
vis[j]=1;is[i][j]=1;
if(bb)printf(",");
printf("%d-%d",i,j);
bb=1;break;
}
}
}
}
printf("\n");
}
return 0;
}