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

解题思路: 本题就是一个大模拟的题目,没有难点,或许有些绕脑,别急慢慢理一下就行,模拟题就这样。所以本题也没什么详细思路,具体过程看代码。

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

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值