题目描述:
输入正整数k表示有n=2^k个运动员进行循环比赛,需要设计比赛日程表。每个选手与其他n-1个
选手各赛一次;每个选手一天只能赛一次;循环赛一共进行n-1天。
按此要求设计一张比赛日程表,该表有n行和n-1列,第i行第j列表示第i个选手第j天遇到的选手。
思路:
不再赘述,只是想熟悉/优化一下代码。。。。。。
代码实现:(不考虑轮空问题)
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 2e5+100;
int arr[1024][1024];
int main(){
//暂不考虑轮空问题
int n;
while(scanf("%d",&n)!=EOF){
arr[1][1]=1;
arr[1][2]=2;
arr[2][1]=2;
arr[2][2]=1;
//CCPC网赛自己写的代码太垃圾,又长思维性又差
for(int i=4;i<=n;i<<=1){
for(int j=1;j<=i/2;j++){
for(int k=1;k<=i/2;k++){
arr[j+i/2][k+i/2]=arr[j][k];
arr[j+i/2][k]=arr[j][k+i/2]=arr[j][k]+i/2;
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
printf("%d%c",arr[i][j]," \n"[j==n]);
}
return 0;
}
THE END;