比赛安排题解

Go CSP-S!  •  5年前


#include<bits/stdc++.h>

using namespace std;

int main()

{

int n;

while(cin>>n)

{

int da=pow(2.0,n)-1; //代表比赛的天数

int me=da+1; //代表比赛的队伍数量

bool dp[70][70]; //记录哪两只队伍已经比赛过

bool vis[70]; //记录一天里该队伍是否已经有比赛安排了

memset(dp,0,sizeof(dp)); //初始化为0

for(int i=1;i<=da;i++) //循环da天

{

int q=0; //控制输出格式的变量

memset(vis,0,sizeof(vis));//每一天的vis数组均需要初始化

cout<<"<"<<i<<">"; //输出每一天的格式要求

for(int j=1;j<=me;j++) //从小到大循环遍历每一只队伍

{

if(vis[j]==1)continue; //如果第j只队伍已经作为了前面队伍的对手则跳过

vis[j]=1; //开始安排第j只队伍的对手,并标记已经便利过

for(int k=j+1;k<=me;k++) //因为按规律得在“-”左边的队伍一定是小于右边的队伍(即对手)

{

if(vis[k]==0&&dp[j][k]==0) //如果从小到大找到队伍k,且j队伍与k队伍没有比赛过而且k队伍在1当天还没有安排则安排j与k比赛

{

dp[j][k]=1; //记录j和k已经比赛过

vis[k]=1; //标记k队伍在这一天里已经有比赛安排

if(q++)cout<<","; //控制输出个数

cout<<j<<"-"<<k;

break; //找到一场比赛后 跳出找接下来的比赛。

}

}

}

cout<<endl;

}

}

return 0;

}


评论:

请先登录,才能进行评论