查找空课时最少教师的C++代码运行异常,该如何修复?
问题分析与代码修复
原代码核心问题
- 语法错误:未引入
<set>头文件,set声明缺少类型参数,多处语句漏写分号,变量名随意混用(lessons/orak拼写混乱) - 不符合C标准:使用可变长数组(VLA)如
int teachernumber[N],C标准不支持运行时长度的栈数组 - 逻辑错误:教师遍历范围遗漏最后一位(循环
i < N只遍历到编号N-1),排课匹配逻辑完全无效,空课时计算公式错误 - 存储结构不合理:4个单独数组存储课表信息,不便于按教师、日期筛选排课
修复后的完整代码
#include <iostream> #include <set> #include <climits> using namespace std; // 存储单条排课信息 struct Lesson { int ts; int tts; int day; int hour; }; int main() { int O, N, M; cin >> O >> N >> M; Lesson lessons[1001]; // O最大为999,开1001足够覆盖边界 for (int i = 0; i < O; i++) { cin >> lessons[i].ts >> lessons[i].tts >> lessons[i].day >> lessons[i].hour; } int empty_hours[101] = {0}; // 教师编号范围1~100,索引直接对应教师编号 for (int ts = 1; ts <= N; ts++) { // 遍历每位教师 for (int day = 1; day <=5; day++) { // 遍历每周5天 set<int> hours; // 存储当日该教师所有排课时段,自动排序 for (int i = 0; i < O; i++) { if (lessons[i].ts == ts && lessons[i].day == day) { hours.insert(lessons[i].hour); } } if (hours.size() > 1) { // 空课时=首尾时段间隔总长度 - 已排课时数 int min_h = *hours.begin(); int max_h = *hours.rbegin(); empty_hours[ts] += (max_h - min_h + 1) - hours.size(); } } } // 查找空课时最少、编号最小的教师 int min_empty = INT_MAX; int res_ts = 1; for (int ts = 1; ts <= N; ts++) { if (empty_hours[ts] < min_empty) { min_empty = empty_hours[ts]; res_ts = ts; } } cout << res_ts << endl; return 0; }
逻辑说明
- 用结构体存储单条排课信息,便于按教师、日期快速筛选
- 对每位教师每天的排课时段存入
set自动排序,直接取首尾元素得到当日最早、最晚排课时段 - 空课时计算逻辑:首尾时段的总长度(
max_h - min_h + 1)减去当日已排课数量,就是首尾之间未排课的空课时数 - 最后遍历所有教师,优先取空课时最少的,空课时相同取编号最小的,符合题目要求
内容的提问来源于stack exchange,提问作者trolli19
相关产品推荐
相关产品推荐

