题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3787
题目难度:正常的题吧
题目描述:就是要设置一个记录刷卡的人数的题,还有输出学号(也就是输入时间的顺序号)。由于随着前一个人刷卡进入之后,中间有一段时间L是可以不用刷卡就能进去的,所以主要需要判断就是两个人进入的时间是否超过刷卡间隙L。
题目解析:我首先是将每一个进入的人的信息存入结构体内,包括进入的学号,进入时间(拆分开为小时,分钟,秒,和总秒数)。然后按照每个结构体的总时间进行排序,就可以不用计算时间的进位的问题也可以解决时间排列没有顺序的问题,为接下来判断是否超过L提供方便。接下来判断时间间隔是否超过L,因为时间的是有序的,只需要判断总时间与上一位的总时间的间隔是否大于L,若是则记录该学生的学号。最后在对学号进行排序,便可以的出有多少人需要刷卡,以及刷卡的人的学号是多少。
以下是我的代码,仅供参考。
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int a[20005];
struct student
{
int h,m,s;//记录小时、分钟、秒
int i;//记录学号
int time;//记录总时间
}st[20005];
int cmp(student a,student b)//结构体排序,sort()判断函数
{
return a.time<b.time;
}
int main()
{
int t;
scanf("%d",&t);
char m,n;
while(t--)
{
int n,L,count_=1,f=1,p=1;
scanf("%d",&n);
scanf("%d",&L);
for(int i=1;i<=n;i++)
{
scanf("%d%c%d%c%d",&st[i].h,&m,&st[i].m,&n,&st[i].s);//将小时,分钟,秒存入结构体
st[i].i=i;//将学号存入结构体
st[i].time=(st[i].h-st[1].h)*3600+(st[i].m-st[1].m)*60+(st[i].s-st[1].s);//将时间转化为秒数存入结构体
}
sort(st+1,st+n+1,cmp);//先按照总时间进行排序
a[0]=st[1].i;//第一个人一定要刷卡
for(int i=2;i<=n;i++)
{
if(st[i].time>=st[f].time+L)//和上一个总时间+间隔时间比较,若大于,要刷卡
{
f=i;
count_++;
a[p++]=st[i].i;
}
}
cout<<count_<<endl;//输出人数
sort(a,a+p);//按照学号进行排序
for(int i=0;i<p;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
return 0;
}