列表

详情


OR126. 课程冲突

描述

小明是一名学生,又到了学校的选课时间,他想选一些课程学习,已知课程开课时间都在每周一到周五之内,早上4讲课,下午4讲课,晚上2讲课。

小明担心选课时间上有所冲突。所以他希望可以对课程时间进行检查。

输入描述

首先输入一个整数n(0<n≤100),表示小明选课总数。

之后输入n行选课信息,每行选课信息有2个数字。

第一个数字表示开课时间,开课时间用2位数表示,前一位用0到4表示周一至周五,后一位用0到9表示从早到晚顺序第几讲课,如12表示礼拜二第三讲课。01表示礼拜一第二讲课。

每行第二个数字表示课程代码,如:204521。课程代码为6位数字。输入课程代码均不重复。

输出描述

如果没有冲突课程,输出YES。

如果有冲突课程,也就是同一个时间多于一节课,输出所有冲突的课程。输出有多行,如果多个不同的上课时间都有课程冲突,按照周一到周五,早上到晚上时间先后,按行输出冲突信息。在同一行内,先输出冲突时间,之后输出这一时间的所有课程,输出课程的顺序为输入中这些课程出现的顺序,课程之间以空格分隔,不要在行末输出多余的空格。

示例1

输入:

5
01 204521
23 204523
22 204526
01 204528
22 204527

输出:

01 204521 204528 
22 204526 204527 

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 336KB, 提交时间: 2019-05-05

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
  
#define MAX 100
  
int main()
{
    //输入
    int n;
    scanf("%d", &n);
    char data[MAX][2][6 + 1];//存输入的数据
    for(int i = 0; i < n; i++)
        scanf("%s%s", &data[i][0], &data[i][1]);
      
    //处理
    int ans[5][10][MAX] = {0};
    int tmp[5][10] = {0};
    for(int i = 0; i < n; i++)
    {
        ans[ data[i][0][0] - '0'][ data[i][0][1] - '0' ][ tmp[ data[i][0][0] - '0'][ data[i][0][1] - '0' ]++ ] = i;
    }
    //输出
    int ConflictFlag = 0;
    for(int i = 0; i < 5; i++)
        for(int j = 0; j < 10; j++)
        {
            if(tmp[i][j] >= 2)
            {
                ConflictFlag = 1;
                printf("%d%d", i, j);
                for(int k = 0; k < tmp[i][j]; k++)
                    printf(" %s", data[ans[i][j][k]][1]);
                printf("\n");
            }
        }
    if(ConflictFlag == 0)
        printf("YES\n");
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2021-09-18

#include<stdio.h>
#include<string.h>
typedef struct fact
{
    int a;
    int b;
    char c[10];
}fact;
int main()
{
    int n;
    fact t[100];
    while (scanf("%d",&n)!=EOF)
    {
        int i,j,a_,b_,item;
        int sum[100]={0};
        for(i=0;i<n;i++)
        {
            scanf("%d %s",&item,t[i].c);
            t[i].a=item/10;
            t[i].b=item%10;
            sum[item]++;
        }
        for(i=0;i<=49;i++)
        {
            if(sum[i]>=2)
            {
                a_=i/10;
                b_=i%10;
                printf("%02d ",i);
                for(j=0;j<n;j++)
                {
                    if((t[j].a==a_)&&(t[j].b==b_)) printf("%s ",t[j].c);
                }
                printf("\n");
            }
        }
    }
    return 0;
}

上一题