6. 循环赛日程表

发布时间:2025-12-09 11:59:37 浏览次数:1

问题描述:

设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:每个选手必须与其他n-1个选手各赛一次,每个选手一天只能赛一次,循环赛一共进行n-1天。

输出样例:

8
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

思路:

按照分治策略,将对手分成两半,n个选手的比赛日程表就可以通过n/2个选手设计的日程表来决定。然后将左上角和左下角的表抄到各自对应的对角上就可以了。

#include<iostream>#include<vector> using namespace std;int n;vector<vector<int>> a;void solve(int L, int R) {    if (R - L == 0) return;    int mid = (L + R ) / 2;    solve(L, mid);    solve(mid+1, R);    int k = (R-L+1)/2;    for (int i = L; i <= (R-L)/2+L; i++)        for (int j = 0; j <= R/2; j++) {            a[i+k][j+k] = a[i][j];            a[i][j+k] = a[i+k][j];        }}int main(){    scanf("%d",&n);    a.resize(n);    for (int i = 0; i < n; i++) {        a[i].resize(n);        a[i][0] = i + 1;     }    solve(0, n-1);    for (int i = 0; i < n; i++) {        for (int j = 0; j < n; j++)            printf("%d ",a[i][j]);        putchar('\n');    }    return 0;} 
循环赛日程表
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477