带模拟。
题意
给出N条记录,每条记录给出一辆车的车牌号、当前时刻以及出入校情况(入校(in)还是出校(out))。然后给出K个查询,每个查询给出一个时刻,输出在这个时刻校园内的车辆数。
查询完毕后输出在学校内停留时间最长的车辆的车牌号(如果有多个,就一并输出)和对应的停留时间。
注意:
- 每个 in 记录都与按时间顺序排列的同一辆车的下一条记录配对,但前提是这条记录是 out。
- 所有未与 out 记录配对的 in 记录以及未与 in 记录配对的 out 记录都必须忽略。
- 定义结构体类型Node,记录单条记录的信息,即车辆的车牌号、记录产生的时刻;以及记录类型(即in或者out)。为了处理时间方便,这里把时间统一转换为以s为单位,样用一个int型即可满足存放要求。定义一个数组all,用以存放所有记录;定义一个数组valid,用以存放有效记录。同时,还需要一个map<string, int> mp,用来记录每辆车在校园中停留的总时长。
- 将所有记录存于all数组,然后将其先按车牌号从小到大排序,若车牌号相同,则按时间值的从小到大排序。
- 遍历所有记录,查找有效记录,并将其存入valid数组。由于有效记录必须是相邻的,因此如果当前遍历到的是i号记录,那么就判断它的车牌号和i+1号记录的车牌号是否是同一个车牌号,并且是否满足i号的是“in” 记录、i+1号的是“out”记录。如果是,就说明这两条记录是有效记录,将它们存入valid 数组,同时令这辆车的总停留时间parkTimeall[i].id]增加两条记录的时间之差。
- 待把所有有效记录存入valid 数组后,接下来应把valid 数组按照时间顺序从小到大排序,然后进入查询阶段。由于查询的时刻是按照时间顺序递增的,因此可以设置一个变量now,用以指向valid数组里面的记录,使得now指向的记录的时刻不超过本次欲查询的时刻;同时设置一个变量numCar,以记录当前校园内的车辆数。显然,当valid[now]为“in”时,numCar加1;而当valid[now]是“out” 时,numCar减1。
- 找出最长总停留时间,输出总停留时间等于maxTime的车辆车牌号。
const int N=10010;
struct Node
{
string id;
string state;
int tim;
bool operator<(const Node &W) const
{
return tim < W.tim;
}
}a[N],valid[N];
map<string,int> mp;
int cnt;
int maxtime;
int n,m;
bool cmp(Node &a,Node &b)
{
if(a.id == b.id) return a.tim < b.tim;
return a.id < b.id;
}
int calc(int hh,int mm,int ss)
{
return hh*3600+mm*60+ss;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
int hh,mm,ss;
a[i].id.resize(7),a[i].state.resize(3);
scanf("%s %d:%d:%d %s",&a[i].id[0],&hh,&mm,&ss,&a[i].state[0]);
a[i].tim=calc(hh,mm,ss);
}
sort(a,a+n,cmp);
for(int i=0;i<n-1;i++)
{
if(a[i].id == a[i+1].id && a[i].state[0] == 'i' && a[i+1].state[0] == 'o')
{
valid[cnt++]=a[i];
valid[cnt++]=a[i+1];
if(mp.count(a[i].id) == 0) mp[a[i].id]=0;
mp[a[i].id]+=a[i+1].tim-a[i].tim;
}
}
sort(valid,valid+cnt);
int k=0;
int car=0;
while(m--)
{
int hh,mm,ss;
scanf("%d:%d:%d",&hh,&mm,&ss);
int t = hh*3600+mm*60+ss;
while(k<cnt && valid[k].tim <= t)
{
if(valid[k].state[0] == 'i') car++;
else car--;
k++;
}
cout<<car<<endl;
}
for(auto t:mp)
maxtime=max(maxtime,t.se);
for(auto t:mp)
if(t.se == maxtime)
cout<<t.fi<<' ';
printf("%02d:%02d:%02d
",maxtime/3600,maxtime%3600/60,maxtime%3600%60);
//system("pause");
return 0;
}