考试安排
题目描述
Eric每次考试最头痛的就是安排考试时间,需要找合适的空闲时间安排考试真的是件很费神的事情。
Eric希望你能帮他算一下能哪些时间可以考试,当然Eric并不想周末进行考试,所以你只需要计算周1到周5的时间就可以了。 我们假设每天有11节课的时间,上午1到4节,下午5-8节,晚上9-11节。Eric已经拿到了参加考试的班级的课表,以及考试需要的时长。注意:考试只能安排在上午、下午、晚上时段,不能跨区间。输入
第一行是一个整数K(1≤K≤100),表示样例的个数
每个样例的第一行是两个整数N(1≤N≤100),T(2≤T≤4),分别表示这些班级课表的条目数和考试所需的课程节数。为了简化问题,Eric只留下了课表条目的上课时间。
以后的N行,每行一个课程的时间,为三个值,D(D∈{Mon,Tue,Wen,Thur,Fri,Sat,Sun}),S,E(1≤S≤E≤11),分别表示上课时间为星期D的第S节到第E节。输出
每个样例先输出一行,为每个样例合适考试的不同时间段的个数。 然后按时间先后顺序,每行输出一个时间段,分别为S,D,E,中间用一个空格隔开。
样例输入
1 10 3 Mon 1 2 Tue 1 2 Wen 1 2 Thur 1 2 Fri 1 2 Mon 5 6 Tue 5 6 Wen 5 6 Thur 5 6 Fri 5 6样例输出
5 Mon 9 11 Tue 9 11 Wen 9 11 Thur 9 11 Fri 9 11
解题思路: 本题就是一个大模拟的题目,没有难点,或许有些绕脑,别急慢慢理一下就行,模拟题就这样。所以本题也没什么详细思路,具体过程看代码。
AC代码:
#include <stdio.h>
int K,N,T,S,E;
int cnt,num;
int record[50][4];
char Day[5], week[7][5] = {"1","Mon","Tue","Wen","Thur","Fri"};
void solve(int Time[][15],int s,int t)
{
num = 0; // 记录连续空闲的课长
for (int k = t; k < t+T; k ++) // 检查每个T时段内,是否都是空闲的
if (Time[s][k] == 0) // 该时段没有上课,num ++
num ++;
if (num == T) // 连续空闲时长 = 考试时长
{ // 保存进 记录数组
record[cnt][0] = s;
record[cnt][1] = t;
record[cnt][2] = t+T-1;
cnt ++;
}
}
int main()
{
scanf("%d",&K);
while ( K --)
{
cnt = 0;
scanf("%d %d",&N,&T);
int classTime[7][15] = {0}; // 用二维数组记录 每天有哪些课上课
for (int i = 1; i <= N; i ++)
{
scanf("%s %d %d",Day,&S,&E);
if (Day[0] == 'M') // 把上课的时段标记为1
for (int j = S; j <= E; j ++) classTime[1][j] = 1;
if (Day[0] == 'T' && Day[1] == 'u')
for (int j = S; j <= E; j ++) classTime[2][j] = 1;
if (Day[0] == 'W')
for (int j = S; j <= E; j ++) classTime[3][j] = 1;
if (Day[0] == 'T' && Day[1] == 'h')
for (int j = S; j <= E; j ++) classTime[4][j] = 1;
if (Day[0] == 'F')
for (int j = S; j <= E; j ++) classTime[5][j] = 1;
}
for (int i = 1; i <= 5; i ++) // 开始检查周一到周五的空闲时间
{
for (int j = 1; j <= 5-T; j ++) // 上午
solve(classTime,i,j);
for (int j = 5; j <= 9-T; j ++) // 下午
solve(classTime,i,j);
for (int j = 9; j <= 12-T; j ++) // 晚上
solve(classTime,i,j);
}
printf("%d\n",cnt); // 输出
for (int i = 0; i < cnt; i ++)
printf("%s %d %d\n",week[record[i][0]],record[i][1],record[i][2]);
}
}