比赛日程安排,WA10分卡死

9. 比赛日程安排

题目ID:9651必做题100分

最新提交:

Wrong Answer

10 分

历史最高:

Wrong Answer

10 分

时间限制: 100ms

空间限制: 131072kB

题目描述

Time limits:1s

Memory limits:32M

题目描述:

设有n=2^k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表

(1) 每个选手必须与其他n-1个选手比赛一次;

(2) 每个选手一天只能赛一次;

(3) 循环赛一共进行n-1天。

按此要求可将比赛日程设计成有n行和n-1列的表。在表中的第i行和第j列处填入第i个选手在第j天遇到的选手。

输入格式:

一个整数k

输出格式:

n行和n-1列的表。在表中的第i行和第j列处填入第i个选手在第j天遇到的选手,每个数字之间用一个空格分隔。

样例输入

1

样例输出

2 1

约定:

1<=k<=10

提示:

#include<bits/stdc++.h>
using namespace std;
int s[1050][1050];
void f(int r,int c,int sz){
    if(sz==2){
        s[r][c]=r+1;
        s[r+1][c]=r;
        return;
    }
    int h=sz/2;
    f(r,c,h);
    f(r+h,c,h);
    for(int i=0;i<h;i++){
        for(int j=0;j<h;j++){
            s[r+i][c+h+j]=s[r+h+i][c+j];
            s[r+h+i][c+h+j]=s[r+i][c+j];
        }
    }
}
int main(){
    int k;
    cin>>k;
    int n=1<<k;
    f(0,0,n);
    for(int i=0;i<n;i++){
        for(int j=0;j<n-1;j++){
            cout<<s[i][j]+1<<' ';
        }
        cout<<endl;
    }
    return 0;
}

这行前面加:

for(int i = 0; i < n; i++) {
        s[i][0] = i + 1;
}

这一段后面可以再加一段循环,
代码:

for(int i = 0; i < h; i++) {
        for(int j = 0; j < h; j++) {
            s[r + h + i][c + h + j] = s[r + i][c + j];
        }
    }

sz == 2 改成1,然后直接返回

因为一共有 n=2^k 个运动员,他们每个人都要和其他所有选手进行一场比赛,但是每一场比赛都需要安排在不同的天进行。我们的目标是生成一个表格,它包含 n 行和 n-1 列,用于描述第 i 个运动员在一天将面对谁(n-1个不同的对手)。

中间大致思路是这样的:

使用嵌套循环结构(或更好的方法,比如利用编程语言提供的功能),创建一个二维数组(或者更现代的向量等)来保存比赛日程。每个单元格都对应一个选手在一场特定比赛中的对手。我们需要确定每位运动员在一天中将遇到的对手。一种简单的策略是使用一个循环来遍历所有可能的对手组合,并确保每个对手只被分配给一个选手一次,应该就没问题了,你去试一下

输入一个整数k(1 <= k <= 10)
计算n = 2^k,即运动员的数量

// 初始化一个n行n-1列的二维数组或矩阵来存储比赛日程
// 这里使用一个简单的线性空间分配方式来存储这个表
// 实际上可能更复杂的数据结构,比如二维向量或者二维数组。
int scheduleTable(n行, n-1列)

// 创建轮次(轮次即为一天)
for (int day = 1; day < n; ++day) { // 因为总共有n-1天
// 初始化这一天的所有比赛对手安排
for (int player = 0; player < n; ++player) {
// 计算该选手当天要比赛的对手的索引
int opponentIndex = calculateOpponentIndex(player, day, n);

    // 将对手的索引存入日程表中对应位置
    scheduleTable[player][day - 1] = opponentIndex + 1; // 加1是因为可能从1开始编号,根据题目要求调整
}

}

// 函数calculateOpponentIndex计算给定选手在给定日应与哪位对手比赛
// 此函数基于一种特定的配对或排序算法来生成日程,需确保每个对手都被遇到且只出现一次

// 输出日程表
for (int i = 0; i < n; ++i) { // 遍历每一行(即每个选手)
for (int j = 0; j < n - 1; ++j) { // 遍历每一列(即每一天)的比赛对手
print(scheduleTable[i][j], " “); // 打印当前选手在某天的对手,并用空格分隔
}
print(”\n"); // 每打印完一行后换行
}

// 这里未给出calculateOpponentIndex的具体实现,因为它取决于特定的配对或排序逻辑。
// 该函数需要根据给定的日程安排算法来确定每位选手在某一天的对手是谁。

我不要脸,为了省时间扣来以前的伪代码 :laughing: