前言
正文
参考题解
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
/* 题意: 输入n条车辆记录,k次查询,每条记录包括车牌号码、当前时间、进/出学校 每次查询给定一个时间,要求输出查询结果,每个查询结果表示该时间下在 校园内的车辆数量,最后输出当天停留在校园内时长最长的车辆号码及停留 时间,若有多辆车辆同时满足停留时间最长,则按照车辆号码升序排序 注意点: 1、对于hh:mm:ss格式的时间,首先应该统一化成以s为单位 ,简化操作 2、本题中注意in和out表示车辆进出校园,对于同一辆车,将其所有进出记录 按照时间顺序升序排序后,需要注意in和out必须配对,即若当前记录为in,则 下一条记录必须为out,否则当前记录无效。 3、一个车可能出入校园好多次,停车的时间应该取之和 解题步骤: 1、排序题首先搞清楚结构体中存放哪些信息,根据题意可知应该有车牌号plate,时间time,进出的状态status。 这里对于结构体Car设置两个数组all和valid分别存放所有的车辆记录和有效的车辆记录。 排序规则:首先以车牌号升序排序,相同的车牌号则以时间进行排序 2、由于需要将车辆id和停留时间绑定到一起,故需要使用一个map来记录每辆车当天总共的停留时间,map底层就是使用红黑树实现 其中的元素默认按照键值升序排序,也就是车辆号码升序排序。 */
const int N=1e4+10;
int n,k;
map<string,int>mp;
struct Car{
char id[10];
int time;
char staus[5];
}all[N],valid[N];
int getTime(int hh,int mm,int ss){
return hh*3600+mm*60+ss;
}
bool cmpByIdAndTime(Car a,Car b){
if(strcmp(a.id,b.id))return strcmp(a.id,b.id)<0;
else return a.time<b.time;
}
bool cmpByTime(Car a,Car b){
return a.time<b.time;
}
int main(){
scanf("%d %d",&n,&k);
int hh,mm,ss;
for(int i=0;i<n;i++){
scanf("%s %d:%d:%d %s",all[i].id,&hh,&mm,&ss,all[i].staus);
all[i].time=getTime(hh,mm,ss);
}
// 排序
sort(all,all+n,cmpByIdAndTime);
// 遍历所有记录,获取有效记录
int num=0,maxTime=-1;//有效记录的条数及车辆停留的最长时间
for(int i=0;i<n-1;i++){
if(!strcmp(all[i].id,all[i+1].id)&&!strcmp(all[i].staus,"in")&&!strcmp(all[i+1].staus,"out")){//是有效记录
valid[num++]=all[i];
valid[num++]=all[i+1];
int stayTime=all[i+1].time-all[i].time;
if(mp.find(all[i].id)==mp.end()) mp[all[i].id]=0;//mp中还没有该车牌号,停留时间清0
mp[all[i].id]+=stayTime;
maxTime=max(maxTime,mp[all[i].id]);//更新最长的停留时间
}
}
sort(valid,valid+num,cmpByTime);//将有效记录按照时间顺序升序排序,因为k次查询也是按照时间升序
// k次查询
int carIndex=0,carNum=0;//分别表示当前车辆的下标以及停车数量 (利用到查询也是按照时间升序的,故对有效记录进行时间排序后可避免多次查询)
for(int i=0;i<k;i++){
scanf("%d:%d:%d",&hh,&mm,&ss);
int time=getTime(hh,mm,ss);
while(carIndex<num&&valid[carIndex].time<=time){
if(!strcmp(valid[carIndex].staus,"in"))carNum++;
if(!strcmp(valid[carIndex].staus,"out"))carNum--;
carIndex++;
}
printf("%d\n",carNum);
}
// 输出停留最长时间的车辆
map<string,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++){
if(it->second==maxTime)printf("%s ",it->first.c_str());//因为mp的key为string类型,故使用%s输出时需要调用c_str()
}
printf("%02d:%02d:%02d\n",maxTime/3600,maxTime%3600/60,maxTime%60);
return 0;
}