开门人和关门人(scanf按格式输入到变量)

题目描述

    每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签到、签离记录,请根据记录找出当天开门和关门的人。

输入描述:

 
    每天的记录在第一行给出记录的条目数M (M > 0 ),下面是M行,每行的格式为 

    证件号码 签到时间 签离时间 

    其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。

输出描述:

    对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。 
    注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,且没有多人同时签到或者签离的情况。

示例1

输入

复制

3
CS301111 15:30:28 17:00:10
SC3021234 08:00:00 11:25:25
CS301133 21:45:00 21:58:40

输出

复制

SC3021234 CS301133
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

typedef struct Record {
	string no;
	int h1,m1,s1;
	int h2,m2,s2;


} Record;

vector<Record> res;

bool compareByCome(Record& a, Record& b) {
	if (a.h1 == b.h1) {
		if (a.m1 == b.m1) {
			return a.s1 < b.s1;
		} else {
			return a.m1 < b.m1;
		}
	} else {
		return a.h1 < b.h1;
	}
}

bool compareByLeave(Record& a, Record& b) {
	if (a.h2 == b.h2) {
		if (a.m2 == b.m2) {
			return a.s2 > b.s2;
		} else {
			return a.m2 > b.m2;
		}
	} else {
		return a.h2 > b.h2;
	}
}


int main() {

	int n;
	cin >> n;
	Record t;
	for (int i = 1; i <= n; i++) {
		cin >> t.no;
		scanf("%d:%d:%d", &t.h1, &t.m1, &t.s1);
		scanf("%d:%d:%d", &t.h2, &t.m2, &t.s2);
		res.push_back(t);
	}
	sort(res.begin(),res.end(),compareByCome);
	cout << res[0].no << " ";

	sort(res.begin(),res.end(),compareByLeave);
	cout << res[0].no << endl;




}
发布了123 篇原创文章 · 获赞 1 · 访问量 5444

猜你喜欢

转载自blog.csdn.net/bijingrui/article/details/104870518