题目
循环日程表问题。
n=2k
n
=
2
k
个运动员进行网球循环赛,需要设计比赛日程表。每个选手必须与其他n−1个选手各赛一次;每个选手一天只能赛一次;循环赛一共进行n−1天。按此要求设计一张比赛日程表,该表有n行和n−1列,第i行j列为第i个选手第j天遇到的选手。
代码
#include <cstdio>
#include <cstdlib>
#include <cmath>
const int maxn = 3000;
int ans[maxn][maxn];
void solve(int d){
if (d == 1){
ans[0][0] = 1;
ans[0][1] = 2;
ans[1][0] = 2;
ans[1][1] = 1;
} else {
solve(d-1);
int n = pow(2, d-1);
for (int i = n; i<2*n; i++)
for (int j = 0; j<n; j++)
ans[i][j] = ans[i-n][j]+n;
for (int i = 0; i<n; i++)
for (int j = n; j<2*n; j++)
ans[i][j] = ans[i][j-n]+n;
for (int i = n; i<2*n; i++)
for (int j = n; j<2*n; j++)
ans[i][j] = ans[i-n][j-n];
}
}
int main(){
int k;
scanf("%d", &k);
solve(k);
for (int i = 0; i<pow(2,k); i++){
for (int j = 1; j<pow(2,k); j++)
printf("%d ", ans[i][j]);
printf("\n");
}
return 0;
}
收获
1.这道题直接可以通过观察数据得出结论简单做,像极了noip2017第一道题,做题的时候还是要机灵。
2.沉迷水题无法自拔。