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

16次阅读

共计 1117 个字符,预计需要花费 3 分钟才能阅读完成。

题目粗心:

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

算法思路:

该题目的思路大体有 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;
} 

正文完
 0