浙江大学有6个校区和很多大门。从每个门口我们可以收集进出时间和穿过大门的车牌号码。现在掌握所有的信息,你应该在任何特定的时间点告诉在校园内停车的车辆数量,并在一天结束时查找停放时间最长的车辆。
输入描述:
每个输入文件都包含一个测试用例。每个案例以两个正整数N(<= 10000),记录数和K(<= 80000)查询数开始。然后N行,每个记录的格式
为:plate_number hh:mm:ss status
其中plate_number是7个英文大写字母或1位数字的字符串; hh:mm:ss代表一小时一小时的时间点:分钟:秒,最早的时间是00:00:00,最晚的时间是23:59:59; 和状态或者是在或出去。
请注意,所有时间将在一天之内。每个“进”记录与同一辆车的下一个记录按照时间顺序配对,前提是记录是“出”记录。任何与“out”记录不匹配的“in”记录都将被忽略,“out”记录也不会与“in”记录配对。保证至少有一辆车在输入中配对良好,没有一辆车同时“进”出。时间是使用24小时制记录的。然后是K行查询,每个行都以hh:mm:ss格式给出一个时间点。注意:查询按照时间顺序排列。
输出描述:
对于每个查询,在一行中输出停在校园内的汽车总数。输出的最后一行应该给出车辆停放时间最长的车牌号以及相应的时间长度。如果这样的车辆不是唯一的,则按字母顺序将所有车牌号码排成一行,用空格分隔。
输入例子:
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出
DB8888A 06:30:50在
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
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
#define maxn 10010
int n,k,Count=0;
struct car{char id[8];int time;char flag[5];
}all[maxn],valid[maxn];
map<string,int> park;
int TimeConv(int hh,int mm,int ss){return hh*3600+mm*60+ss;
}
bool cmpTimeId(car a,car b){if(strcmp(a.id,b.id))return strcmp(a.id,b.id)<0;else return a.time<b.time;
}
bool cmpTime(car a,car b){return a.time<b.time;
}
int main(){int hh,mm,ss;scanf("%d%d",&n,&k);for(int i=0;i<n;i++){scanf("%s %d:%d:%d %s",all[i].id,&hh,&mm,&ss,all[i].flag);all[i].time=TimeConv(hh,mm,ss);park[all[i].id]=0;//initialize}sort(all,all+n,cmpTimeId);for(int i=0;i<n-1;){if(strcmp(all[i].id,all[i+1].id)==0&&strcmp(all[i].flag,"in")==0&&strcmp(all[i+1].flag,"out")==0){valid[Count++]=all[i];valid[Count++]=all[i+1];park[all[i].id]+=all[i+1].time-all[i].time;i=i+2;}else i++;}for(int t=0;t<k;t++){scanf("%d:%d:%d",&hh,&mm,&ss);int num=0;int temp=TimeConv(hh,mm,ss);for(int i=0;i<Count;i=i+2){if(valid[i].time<=temp&&valid[i+1].time>temp)//这里的第二个必须是'>',在那个时间点离开就不能计算在内{num++;}}cout<<num<<endl;}int maxT=0;for(map<string,int>::iterator it=park.begin();it!=park.end();it++){if(it->second>maxT)maxT=it->second;}for(map<string,int>::iterator it=park.begin();it!=park.end();it++){if(it->second==maxT)printf("%s ",it->first.c_str());}printf("%02d:%02d:%02d",maxT/3600,(maxT%3600)/60,(maxT%3600)%60);}