noip1996 比賽安排
阿新 • • 發佈:2019-02-08
A1107. 比賽安排
時間限制:1.0s 記憶體限制:256.0MB
總提交次數:388
AC次數:179 平均分:57.73
試題來源
NOIP1996 提高組
問題描述
設有有2n(n<=6)個球隊進行單迴圈比賽,計劃在2n – 1天內完成,每個隊每天進行一場比賽。設計一個比賽的安排,使在2n –
1天內每個隊都與不同的對手比賽。
例如n=2時的比賽安排:
隊 1 2 3 4
比賽 1==2 3==4 一天
1==3 2==4 二天
1==4 2==3 三天 輸入格式 輸入的第一行包含以個整數n。 輸出格式 輸出2^n-1行,每行開頭為一對尖括號,裡面輸出天數序號。隨後寫出這天的安排。詳細格式見樣例。有多個方案則輸出字典序最小的方案。 樣例輸入 2 樣例輸出 <1>1-2,3-4
<2>1-3,2-4
<3>1-4,2-3 資料規模和約定 n<=6
例如n=2時的比賽安排:
隊 1 2 3 4
比賽 1==2 3==4 一天
1==3 2==4 二天
1==4 2==3 三天 輸入格式 輸入的第一行包含以個整數n。 輸出格式 輸出2^n-1行,每行開頭為一對尖括號,裡面輸出天數序號。隨後寫出這天的安排。詳細格式見樣例。有多個方案則輸出字典序最小的方案。 樣例輸入 2 樣例輸出 <1>1-2,3-4
<2>1-3,2-4
<3>1-4,2-3 資料規模和約定 n<=6
解析:hash判重。
用b[i][j]來記錄 i 與 j 是否進行過比賽,一共n個球隊。
題目上雖然沒說,但輸出應當按照字典序輸出。
程式碼:
#include<cstdio> #include<cstring> #define maxn 100 using namespace std; bool a[maxn],b[maxn][maxn]; int main() { int n,i,j,k,s,sum; scanf("%d",&n); s=1<<n; for(i=1;i<s;i++) { memset(a,0,sizeof(a)); printf("<%d>",i); sum=0; for(j=1;j<s;j++) for(k=j+1;k<=s;k++) if(!a[j] && !a[k] && !b[j][k] && !b[k][j]) { a[j]=a[k]=1; b[j][k]=b[k][j]=1,sum++; printf("%d-%d",j,k); if(sum<(s>>1))printf(" "); } printf("\n"); } return 0; }