Solution:
题目大意:
给出n个汽车的记录,分别记录车的车牌号、到达或者离开时间。再给出k个查询,每个查询给出一个时间,求出在这个时间点有多少车停在校园内。并且求出所有车中累计停留时间最长的车的车牌号以及最长时间。每个in都要与后一个时间连续的out匹配,不能匹配的不计算在内(比如连续两个in,第一个就不算,或者连续两个out,第二个就不算)。
代码如下:
//模拟
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
#include<map>
#include<string.h>
#define early 0
#define late 23*3600+59*60+59
using namespace std;
int n,k;//n条记录,k个查询
struct car{
string name,flag;
int time;
};
vector<car> vec;
map<string,int> mp_time;
map<string,int> mp;
bool cmp(car a,car b){
return a.time<b.time;
}
int main(){
//cin>>n>>k;
scanf("%d%d",&n,&k);
vec.resize(n);
int h,m,s;//小时,分钟,秒
char name_ch[10],flag[10];
for(int i=0;i<n;i++){
scanf("%s",name_ch);
vec[i].name=name_ch;
scanf("%d:%d:%d",&h,&m,&s);
scanf("%s",flag);
vec[i].flag=flag;
vec[i].time=h*3600+m*60+s;
}
sort(vec.begin(),vec.end(),cmp);
for(int i=0;i<k;i++){
int temp;
scanf("%d:%d:%d",&h,&m,&s);
temp=h*3600+m*60+s;
int ans=0;
for(int j=0;j<vec.size();j++){
if(vec[j].flag=="in"){
mp[vec[j].name]=vec[j].time;
}
if(mp[vec[j].name]!=0&&vec[j].flag=="out"&&vec[j].time>mp[vec[j].name]){
if(vec[j].time>temp&&mp[vec[j].name]<=temp){
ans++;
}
if(i==0){
mp_time[vec[j].name]=mp_time[vec[j].name]+vec[j].time-mp[vec[j].name];
}
mp[vec[j].name]=0;
}
}
printf("%d\n",ans);
}
int maxl=-1;
vector<string> name;
map<string,int>::iterator it;
for(it=mp_time.begin();it!=mp_time.end();it++){
if(it->second>maxl){
maxl=it->second;
}
}
for(it=mp_time.begin();it!=mp_time.end();it++){
if(it->second==maxl){
name.push_back(it->first);
}
}
for(int j=0;j<name.size();j++){
cout<<name[j]<<" ";
}
h=maxl/3600;
m=(maxl-h*3600)/60;
s=maxl-h*3600-m*60;
printf("%02d:%02d:%02d",h,m,s);
return 0;
}