关于算法-数据结构:PAT甲级1006-Sign-In-and-Sign-Out

题目粗心:

每天第一个到机房的人要把门关上,最初一个来到的人要把门关好。现有一堆芜杂的机房签到、签离记录,请依据记录找出当天开门和关门的人。(没有人同时签到或者同时签离)

算法思路:

该题目的思路大体有2种.
第一种就是首先应用构造体数组student保留所有的学生,而后先依照达到工夫升序排列,数组中第一个元素就是最先达到的学生,而后依照来到工夫降序排列,数组中第一个元素就是最初来到的学生。
第二种就是应用2个构造体变量a和b别离保留以后Sign_in_time最小和Sign_out_time最大的学生,
在输出结束后,就能够输入对应的ID_number即可。这里采纳了第一种办法,然而第二种办法更优。

提交后果:

AC代码:
#include<cstdio>
#include<string>
#include<algorithm>

using namespace std;

struct Student{
    string ID_number;
    int Sign_in_time;
    int Sign_out_time;
};

int getSeconds(int hh,int mm,int ss){
    return hh*3600+mm*60+ss;
}

bool cmpByIn(Student a,Student b){
    return a.Sign_in_time<b.Sign_in_time;
}

bool cmpByOut(Student a,Student b){
    return a.Sign_out_time>b.Sign_out_time;
}

int main(){
    int M;
    scanf("%d",&M);
    Student student[M];
    char id[20];
    int hh,mm,ss;
    for(int i=0;i<M;++i){
        scanf("%s %d:%d:%d",id,&hh,&mm,&ss);
        student[i].ID_number = id;
        student[i].Sign_in_time = getSeconds(hh,mm,ss);
        scanf("%d:%d:%d",&hh,&mm,&ss);
        student[i].Sign_out_time = getSeconds(hh,mm,ss);
    }
    //先依照达到工夫升序排列,取得最先达到教室的人
    sort(student,student+M,cmpByIn); 
    printf("%s ",student[0].ID_number.c_str());
    //而后依照来到工夫降序排列,取得最初来到教室的人
    sort(student,student+M,cmpByOut); 
    printf("%s",student[0].ID_number.c_str());
    return 0;
} 

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理