解题思路
- 首先得找出in和out都匹配的车辆,不然在后面找有多少辆车在里面且pair是很麻烦的
- 先按车牌相同的筛选出来pair的停车和离开的时间
- 将其保存在car数组里面,并将car排序
- 通过car数组可以知道在当前车之前有多少辆车在里面,in记为1,out记为-1
- 比较该车与条件时间,可以知道车辆数
code
#include <bits/stdc++.h>
using namespace std;
struct node{
string id;
int time,status;
};
bool cmp1(node a,node b){
return a.id!=b.id?a.id<b.id:a.time<b.time;
}
bool cmp2(node a,node b){
return a.time<b.time;
}
int main(){
int n,m,hh,mm,ss,maxt=-1,time=0,j=0;
string s;
cin>>n>>m;
vector<node>res(n),car;
for(int i=0;i<n;i++){
cin>>res[i].id;
scanf("%d:%d:%d",&hh,&mm,&ss);
res[i].time=hh*3600+mm*60+ss;
cin>>s;
s=="in"?res[i].status=1:res[i].status=-1;
}
sort(res.begin(),res.end(),cmp1);
map<string ,int> ans;
for(int i=1;i<n;i++){
if(res[i].id==res[i-1].id&&res[i].status==-1&&res[i-1].status==1){
car.push_back(res[i-1]);
car.push_back(res[i]);
ans[res[i-1].id]+=res[i].time-res[i-1].time;
maxt=max(ans[res[i-1].id],maxt);
}
}
sort(car.begin(),car.end(),cmp2);
vector<int> pos(n);
for(int i=0;i<car.size();i++)
i?pos[i]=pos[i-1]+car[i].status:pos[i]+=car[i].status;
while(m--){
scanf("%d:%d:%d",&hh,&mm,&ss);
time=hh*3600+mm*60+ss;
while(j<car.size()){
if(car[j].time>time){
cout<<pos[j-1]<<endl;
break;
}else if(j==car.size()-1)
cout<<pos[j]<<endl;
j++;
}
}
for(auto it:ans) if(it.second==maxt) cout<<it.first<<' ';
printf("%02d:%02d:%02d",maxt/3600,(maxt%3600)/60,maxt%60);
return 0;
}