A - 开门人和关门人(sort+结构体)
到、签离记录,请根据记录找出当天开门和关门的人。
每天的记录在第一行给出记录的条目数M ( > 0 ),下面是M行,每行的格式为
证件号码 签到时间 签离时间
其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。
注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,
且没有多人同时签到或者签离的情况。
3 1 ME3021112225321 00:00:00 23:59:59 2 EE301218 08:05:35 20:56:35 MA301134 12:35:45 21:40:42 3 CS301111 15:30:28 17:00:10 SC3021234 08:00:00 11:25:25 CS301133 21:45:00 21:58:40
ME3021112225321 ME3021112225321 EE301218 MA301134 SC3021234 CS301133
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std; //sort的头文件
struct People
{
char num[50];
int Come;
int Out;
}p[5000]; //结构体
注意结尾的分号
bool cmp1(People a,People b) //假设存在多个人同时签到,输出证件号较小的
{
// if (a.Come == b.Come)
// {
// int t = strcmp(a.num , a.num);
//前面的大,返回1;相等返回0;前面的小,返回-1
// if (t == -1)
// return true;
// else
// return false;
// }
// else
return a.Come < b.Come;
}
bool cmp2(People a,People b)
{
return a.Out > b.Out;
//从大到小排序
}
int main()
{
int n,m;
scanf ("%d",&n);
while (n--)
{
scanf ("%d",&m);
for (int i = 1 ; i <= m ; i++)
{
int h,m,s;
scanf ("%s",p[i].num);
scanf ("%d:%d:%d",&h,&m,&s);
p[i].Come = h*3600 + m*60 + s;
scanf ("%d:%d:%d",&h,&m,&s);
p[i].Out = h*3600 + m*60 + s;
}
sort(p+1,p+m+1,cmp1);
printf ("%s ",p[1].num);
sort(p+1,p+m+1,cmp2);
printf ("%s\n",p[1].num);
}
return 0;
}
sort() //快速排序 O(nlogn)
sort( , , ) //1.要排序的容器起始地址 2.要排序的容器的末地址+1 3.排序方法(可省略:默认是从小到大)
数组排序
#include<stdio.h>
#include<algorithm> //头文件
using namespace std;
bool cmp(int a,int b)
{
return a > b;
}
int main()
{
int n;
int num[100];
scanf ("%d",&n);
for (int i = 0 ; i < n ; i++)
{
scanf ("%d",&num[i]);
}
sort(num,num+n);
for (int i = 0 ; i < n ; i++)
{
printf ("%d%c",num[i],i==n-1?'\n':' ');
//数组的一种输出方法
}
return 0;
}