XTU OJ 1275 Exam Schedule

考试安排

题目描述

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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值