Problem Descriptionc++
設有n個選手進行循環比賽,其中n = 2m,要求每名選手要與其餘n-1名選手都賽一次,每名選手天天比賽一次,循環賽共進行n - 1天,要求天天沒有選手輪空。ide
Input Formatspa
一個正整數m(2 <= m <= 6)。code
Output Formatorm
樣例形式的比賽安排表。blog
Algorithm Designip
模擬ci
Problem Analysisit
模擬:io
1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 5 6
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 2 1 4 3
7 8 5 6 3 4 1 2
8 7 6 5 4 3 2 1
題目樣例暴露了規律:每2^i行的下一行就要針對上一行進行長度爲2^i單位之間的調換,直接進行O(mn^2)的模擬就能夠過。
Source Code
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int m,num[1001]; 6 7 int check(int x) 8 { 9 int mi=0; 10 while(x) 11 { 12 if((x&1))return mi; 13 x/=2; 14 mi++; 15 } 16 return mi; 17 } 18 19 int main() 20 { 21 freopen("match.in","r",stdin); 22 freopen("match.out","w",stdout); 23 cin>>m; 24 for(int i=1;i<=(1<<m);i++) 25 { 26 num[i]=i; 27 cout<<i<<" "; 28 } 29 cout<<endl; 30 for(int i=2;i<=(1<<m);i++) 31 { 32 int last=check(i-1); 33 for(int j=0;j<=last;j++) 34 for(int k=1;k<=(1<<m);k+=(1<<j+1)) 35 for(int f=1;f<=(1<<j);f++) 36 swap(num[k+f-1],num[k+f-1+(1<<j)]); 37 for(int j=1;j<=(1<<m);j++) 38 cout<<num[j]<<" "; 39 cout<<endl; 40 } 41 return 0; 42 }