返回目录
题意
给出N条记录,每条记录给出一辆车的车牌号、 当前时刻以及出入校情况(入校(in)还是出校(ou))。然后给出K个查询,每个查询给出个时刻, 输出在这个时刻校园内的车辆数。查询完毕后输出在学校内停留时间最长的车辆的车牌号(如果有多个,就一并输出)和对应的停留时间。注意:对同一辆车来说, 配对的on和off必须满足在把这辆车的记录按时间顺序排列后,在它们之间不允许出现其他on或者off的记录;否则,将被视为无效记录。
样例(可复制)
16 7
JH007BD 18:00:01 in
ZD00001 11:30:08 out
DB8888A 13:00:00 out
ZA3Q625 23:59:50 out
ZA133CH 10:23:00 in
ZD00001 04:09:59 in
JH007BD 05:09:59 in
ZA3Q625 11:42:01 out
JH007BD 05:10:33 in
ZA3Q625 06:30:50 in
JH007BD 12:23:42 out
ZA3Q625 23:55:00 in
JH007BD 12:24:23 out
ZA133CH 17:11:22 out
JH007BD 18:07:01 out
DB8888A 06:30:50 in
05:10:00
06:30:50
11:00:00
12:23:42
14:00:00
18:00:00
23:59:00
样例输出
1
4
5
2
1
0
1
JH007BD ZD00001 07:20:09
注意点
- 注意使用gettime对时间进行转换,更方便处理。
- k次查询的时刻是递增的,要利用好这点,否则会超时。
- 本题使用了STL库的map,可以学完后面的内容再回来看。在这里对其出现的内容进行说明:使用了map<string,int> parktime;进行声明,由于map和vector,string一样是动态的,故不需要声明大小。map.count(str)会返回str在map里的记录数。map<string,int>::iterator声明了一个map<string,int>类型的迭代器,用于遍历map。it->first可以得到map的第一个string类型元素,it->second可以得到第二个int类型元素。
#include<bits/stdc++.h>
using namespace std;
const int maxn=10010;
struct car{
char id[8];
int time,sta;
}all[maxn],vaild[maxn];
int num=0,maxtime=-1;//有效记录数,最久停留时间
map<string,int> parktime;//id<-->time
int gettime(int h,int m,int s){
return h*3600+m*60+s;
}
bool cmp1(car a,car b){//按照id和time
if(strcmp(a.id,b.id))return strcmp(a.id,b.id)<0;
else return a.time<b.time;
}
bool cmp2(car a,car b){//按照time
return a.time<b.time;
}
int main(){
int n,k,h,m,s;
char tmp[5];
cin>>n>>k;
for(int i=0;i<n;i++){
scanf("%s %d:%d:%d %s",all[i].id,&h,&m,&s,tmp);
if(!strcmp(tmp,"in"))all[i].sta=0;//in记录为0
else all[i].sta=1;//outout记录为1
all[i].time=gettime(h,m,s);
}
sort(all,all+n,cmp1);
for(int i=0;i<n-1;i++){
if(!strcmp(all[i].id,all[i+1].id)&&all[i+1].sta-all[i].sta==1){//如果记录有效
vaild[num++]=all[i];
vaild[num++]=all[i+1];
int intime=all[i+1].time-all[i].time;
if(parktime.count(all[i].id)==0)parktime[all[i].id]=0;
parktime[all[i].id]+=intime;
maxtime=max(maxtime,parktime[all[i].id]);
}
}
sort(vaild,vaild+num,cmp2);
int now=0,numcar=0;
while(k--){//k次查询
scanf("%d:%d:%d",&h,&m,&s);
int time=gettime(h,m,s);
while(now<num&&vaild[now].time<=time){
if(vaild[now].sta==0)numcar++;
else numcar--;
now++;
}
printf("%d\n",numcar);
}
for(map<string,int>::iterator it=parktime.begin();it!=parktime.end();it++){
if(it->second==maxtime)printf("%s ",it->first.c_str());
}
printf("%02d:%02d:%02d\n",maxtime/3600,maxtime%3600/60,maxtime%60);
return 0;
}