考勤刷卡
题目
小蓝负责一个公司的考勤系统,他每天都需要根据员工刷卡的情况来确定每个员工是否到岗。
当员工刷卡时,会在后台留下一条记录,包括刷卡的时间和员工编号,只要在—天中员工刷过—次卡,就认为他到岗了。
现在小蓝导出了—天中所有员工的刷卡记录,请将所有到岗员工的员工编号列出。
输入格式
输入的第一行包含一个正整数n,表示—天中所有员工的刷卡记录的条数。接下来n行,每行包含—条刷卡记录,每条刷卡记录的格式为:
HH:MM:SS ID
其中 HH:MM: SS表示刷卡时间, HH为一个0到23之间的两位十进制整数(可能含前导0)表示时,MM为一个0到59之间的两位十进制整数(可能含前导0)表示分, SS为一个0到59之间的两位十进制整数(可能含前导0)表示秒,ID为一个不含前导0的整数表示员工的编号。所有记录按照刷卡时间升序排列,可能同—时刻有多人刷卡。
输出格式
输出若干行,每行包含一个整数,按照从小到大的顺序输出,表示到岗员工的编号。
样例输入
13:05:42 103
14:07:12 4567
15:03:00 103
17:00:21 1
样例输出
1
103
4567
题目分析
1.首先这道题有多个点需要注意
- 员工编号不含前导0
- 同一个员工可以多次打卡
- 输入时,是按员工打卡时间进行排序;输出时,则是按员工编号进行排序
由此,我们便可以判断出一件事,员工的打卡时间只是为了去记录有没有这个员工打卡,无需对打卡时间有着过多的处理
2.为了给员工编号进行排序,我们启用一个更加简便的函数——sort函数。
sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。sort函数进行排序的时间复杂度为n*log2n,比冒泡之类的排序算法效率要高,sort函数包含在头文件为#include<algorithm>的c++标准库中
语法 Sort(start,end,cmp)void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
参数
(1)start表示要排序数组的起始地址;迭代器的起始位置,对于数组来说就是数组的首地址,一般写上数组名就可以,因为数组名是一个指针常量。
(2)end表示数组结束地址的下一位;迭代器的结束位置,即首地址加上数组的长度n(代表尾地址的下一地址)。
(3)cmp用于规定排序的方法,可不填,默认升序。迭代器的结束位置,即首地址加上数组的长度n(代表尾地址的下一地址)。
功能
sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。
一般是直接对数组进行排序,例如对数组a[10]排序,sort(a,a+10)。而sort函数的强大之处在可与cmp函数结合使用,即排序方法的选择。
sort函数介绍
3.我们需要注意处理员工编号的处理
- 员工编号不含前导0,即编号从1开始
- 多次出现的员工编号只需要计算一次,所以,经sort函数处理后的员工编号数组按升序排列后,需检查a[i]是否与a[i+1]相等。
代码
#include <iostream> #include <algorithm> using namespace std; int main() { int id[10001]; int n; string s; cin>>n; for(int i=0;i<n;i++) { cin>>s; cin>>id[i]; } sort(id,id+n);//变为升序排列 for(int i=0;i<n;i++) { if(i>0&&id[i]==id[i-1]) { continue; } cout<<id[i]<<endl; } return 0; }
标签:sort,排序,刷卡,员工,蓝桥,编号,升序,例题,考勤 From: https://www.cnblogs.com/hcrzhi/p/17787857.html