基础题,分别按照签到时间从小到大排序,签离时间从大到小排序即可。
由于本题输入数据量大且复杂,所以使用 scanf 输入。
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXM = 10000;
struct person //人员
{
char number[20]; //证件号码
int inTime; //签到时间(转换为总秒数)
int outTime; //签离时间(转换为总秒数)
}p[MAXM];
//签到时间排序标准,从小到大
bool cmpIn(person p1, person p2)
{
return p1.inTime < p2.inTime;
}
//签离时间排序标准 从大到小
bool cmpOut(person p1, person p2)
{
return p1.outTime > p2.outTime;
}
int main()
{
int N, M;
int inH, inM, inS; //签到时,分,秒
int outH, outM, outS; //签离时,分,秒
scanf("%d", &N);
while (N--)
{
scanf("%d", &M);
for (int i = 0; i < M; i++)
{
scanf("%s %d:%d:%d %d:%d:%d", p[i].number, &inH, &inM, &inS, &outH, &outM, &outS);
p[i].inTime = inH * 3600 + inM * 60 + inS; //签到时间总秒数
p[i].outTime = outH * 3600 + outM * 60 + outS; //签离时间总秒数
}
sort(p, p + M, cmpIn); //签到时间排序
printf("%s ", p[0].number);
sort(p, p + M, cmpOut); //签离时间排序
printf("%s\n", p[0].number);
}
return 0;
}
继续加油。