考试安排
题目描述
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
思路:二维数组标记一下,模拟一张课表,有课的标记为1,无课为0,记得每次要清空课表。
然后判断,答主写累了,不想思考,于是无脑遍历。
要注意Day是周一到周日,答主一开始只看到了eric不会布置在周末,数组Day没存周末,然后re了。
用的c++的输入输出,cin<=>scanf ; cout <=> printf ; endl -> '\n'。
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
char Day[8][10]={"Mon","Tue","Wen","Thur","Fri","Sat","Sun"};
int GetDay(char str[]){
for(int i=0;i<7;i++){
if(strcmp(str,Day[i])==0) return i;
}
}
int main()
{
int K;
int schedule[10][15];
cin>>K;
while(K--){
memset(schedule,0,sizeof schedule);
int n,t;
cin>>n>>t;
while(n--){
char str[10];
scanf("%s",str);
int y1,y2;
cin>>y1>>y2;
int x=GetDay(str);
if(x==6||x==5) continue;
for(int i=y1;i<=y2;i++) schedule[x][i]=1;
}
int cnt=0;
for(int i=0;i<5;i++){
if(t==2){
// morning
if(!schedule[i][1]&&!schedule[i][2])
cnt++;
if(!schedule[i][2]&&!schedule[i][3])
cnt++;
if(!schedule[i][3]&&!schedule[i][4])
cnt++;
// afternoon 5~8
if(!schedule[i][5]&&!schedule[i][6])
cnt++;
if(!schedule[i][6]&&!schedule[i][7])
cnt++;
if(!schedule[i][7]&&!schedule[i][8])
cnt++;
// night
if(!schedule[i][9]&&!schedule[i][10])
cnt++;
if(!schedule[i][10]&&!schedule[i][11])
cnt++;
}
else if(t==3){
// morning
if(!schedule[i][1]&&!schedule[i][2]&&!schedule[i][3])
cnt++;
if(!schedule[i][2]&&!schedule[i][3]&&!schedule[i][4])
cnt++;
// afternoon
if(!schedule[i][5]&&!schedule[i][6]&&!schedule[i][7])
cnt++;
if(!schedule[i][6]&&!schedule[i][7]&&!schedule[i][8])
cnt++;
//night
if(!schedule[i][9]&&!schedule[i][10]&&!schedule[i][11])
cnt++;
}
else if(t==4){
if(!schedule[i][1]&&!schedule[i][2]&&!schedule[i][3]&&!schedule[i][4])
cnt++;
if(!schedule[i][5]&&!schedule[i][6]&&!schedule[i][7]&&!schedule[i][8])
cnt++;
}
}
cout<<cnt<<endl;
for(int i=0;i<5;i++){
if(t==2){
// morning
if(!schedule[i][1]&&!schedule[i][2])
printf("%s 1 2\n",Day[i]);
if(!schedule[i][2]&&!schedule[i][3])
printf("%s 2 3\n",Day[i]);
if(!schedule[i][3]&&!schedule[i][4])
printf("%s 3 4\n",Day[i]);
// afternoon 5~8
if(!schedule[i][5]&&!schedule[i][6])
printf("%s 5 6\n",Day[i]);
if(!schedule[i][6]&&!schedule[i][7])
printf("%s 6 7\n",Day[i]);
if(!schedule[i][7]&&!schedule[i][8])
printf("%s 7 8\n",Day[i]);
// night
if(!schedule[i][9]&&!schedule[i][10])
printf("%s 9 10\n",Day[i]);
if(!schedule[i][10]&&!schedule[i][11])
printf("%s 10 11\n",Day[i]);
}
else if(t==3){
// morning
if(!schedule[i][1]&&!schedule[i][2]&&!schedule[i][3])
printf("%s 1 3\n",Day[i]);
if(!schedule[i][2]&&!schedule[i][3]&&!schedule[i][4])
printf("%s 2 4\n",Day[i]);
// afternoon
if(!schedule[i][5]&&!schedule[i][6]&&!schedule[i][7])
printf("%s 5 7\n",Day[i]);
if(!schedule[i][6]&&!schedule[i][7]&&!schedule[i][8])
printf("%s 6 8\n",Day[i]);
//night
if(!schedule[i][9]&&!schedule[i][10]&&!schedule[i][11])
printf("%s 9 11\n",Day[i]);
}
else if(t==4){
if(!schedule[i][1]&&!schedule[i][2]&&!schedule[i][3]&&!schedule[i][4])
printf("%s 1 4\n",Day[i]);
if(!schedule[i][5]&&!schedule[i][6]&&!schedule[i][7]&&!schedule[i][8])
printf("%s 5 8\n",Day[i]);
}
}
}
return 0;
}