很简单的题
设有2^n(n<=6)个球队进行单循环比赛,计划在2^n-1天内完成,每个队每天进行一场比赛。
设计一个比赛的安排,使在2^n-1天内每个队都与不同的对手比赛.例如n=2时的比赛安排为:
队 1 2 3 4
比赛安排为
第一天 1-2 3-4
第二天 1-3 2-4
第三天 1-4 2-3
题解:
is[i][j]记录i与j有没有比过,vis[i]记录当天i有没有比过,
每天都从i=1开始遍历vis[i],若i在当天还没有出现过,则
遍历is[i][j],取符合条件的最小j.
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<stack> #include<cstdio> #include<queue> #include<map> #include<vector> #include<set> using namespace std; const int maxn=1010; const int INF=0x3fffffff; typedef long long LL; typedef unsigned long long ull; int vis[110],is[110][110]; int n,t; int main(){ scanf("%d",&n); t=(1<<n)-1; while(t--){ memset(vis,0,sizeof(vis)); //当天有没有比赛过 bool ok=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(ok) printf(" "); printf("%d-%d",i,j); ok=1; break; //为这一轮的i找一个就可以了 } } } } printf(" "); } return 0; }