PTAc语言天梯赛座位分配
时间: 2025-05-25 19:15:49 浏览: 15
### PTA C语言天梯赛座位分配的实现方法
#### 问题描述
天梯赛座位分配的核心在于合理安排不同学校的参赛队员,确保来自同一所学校的队员不会相邻。同时,在某些情况下还需要考虑特殊规则,比如当仅剩一所学校未被分配时,需要让该学校的队员隔位就坐。
---
#### 解决方案概述
为了实现这一目标,可以采用以下策略:
1. **模拟分配过程**:按照题目给定的顺序依次为每位队员分配座位号。
2. **记录状态**:通过数组或其他数据结构保存当前已分配的状态以及剩余空位情况。
3. **特殊情况处理**:对于最后一所学校单独设置逻辑,确保其队员能够隔位就坐。
以下是基于以上思路的具体代码实现:
```c
#include <stdio.h>
#define MAX_SCHOOLS 100 // 假设最多有100所学校
#define TEAM_SIZE 10 // 每支队伍固定10人
typedef struct {
int school_id; // 学校ID
int team_count; // 队伍数量
} School;
int main() {
int N, total_seats = 0;
scanf("%d", &N); // 输入学校数量
School schools[N];
for (int i = 0; i < N; ++i) {
scanf("%d", &schools[i].team_count);
schools[i].school_id = i + 1; // 设置学校ID从1开始
total_seats += schools[i].team_count * TEAM_SIZE; // 计算总人数
}
int seats[total_seats]; // 座位数组,初始值全置为-1表示未占用
for (int i = 0; i < total_seats; ++i) {
seats[i] = -1;
}
// 循环分配座位
int current_seat = 0; // 当前正在分配的座位索引
while (current_seat < total_seats) {
bool assigned = false;
for (int s = 0; s < N && !assigned; ++s) { // 遍历每所学校
if (schools[s].team_count > 0) { // 如果还有未分配的队员
// 查找下一个可用座位
for (int pos = current_seat; pos < total_seats; ++pos) {
if (seats[pos] != schools[s].school_id) { // 确保不与前面的学生冲突
seats[pos] = schools[s].school_id; // 分配座位
--(schools[s].team_count); // 减少该校待分配人数
current_seat = pos + 1; // 更新到下一位置
assigned = true;
break;
}
}
}
}
if (!assigned) { // 若本轮未能成功分配,则尝试跳过当前位置
++current_seat;
}
}
// 特殊情况:如果只剩一所学校未完全分配,则强制隔位就坐
int remaining_school = -1;
for (int s = 0; s < N; ++s) {
if (schools[s].team_count > 0) {
if (remaining_school == -1) {
remaining_school = s;
} else {
printf("Error: More than one school has unallocated members.\n");
return 1;
}
}
}
if (remaining_school != -1) { // 只有一所学校尚未分配完毕
int step = 2; // 隔一位坐下
for (int pos = 0; pos < total_seats && schools[remaining_school].team_count > 0; pos += step) {
if (seats[pos] == -1 || seats[pos] != schools[remaining_school].school_id) {
seats[pos] = schools[remaining_school].school_id;
--(schools[remaining_school].team_count);
}
}
}
// 输出最终结果
for (int i = 0; i < total_seats; ++i) {
if (seats[i] != -1) {
printf("Seat %d -> School %d\n", i + 1, seats[i]); // 座位号从1开始计数
}
}
return 0;
}
```
---
#### 关键点解析
1. **数据存储**:定义了一个 `School` 结构体用于存储每所学校的 ID 和队伍数量[^2]。
2. **座位分配核心逻辑**:利用嵌套循环逐一为每位队员分配座位,并确保来自同一所学校的队员不会连续排列[^3]。
3. **特殊情况处理**:当仅剩一所学校未完全分配时,调整步长以实现隔位就坐的要求[^1]。
4. **效率优化**:通过提前退出循环等方式降低不必要的计算量,提高运行速度。
---
###
阅读全文
相关推荐


















