参考文献
PAT甲级辅导课
C++ 代码
#include<bits/stdc++.h>
using namespace std;
struct Event
{
int tm, status;
bool operator< (const Event& e)const
{
return tm < e.tm;
}
};
int get(const vector<Event>& ets)
{
int res = 0;
for(int i = 0; i < ets.size(); i+=2)
{
res += ets[i+1].tm - ets[i].tm;
}
return res;
}
int main()
{
int n , m;
scanf("%d%d", &n, &m);
unordered_map<string, vector<Event> > cars;
char id[10], status[10];
for(int i = 0; i < n; ++i)
{
int hh,mm,ss;
scanf("%s %d:%d:%d %s", id, &hh,&mm,&ss, status);
int t = hh * 3600+mm*60+ ss;
int s = 0;
if('o' == status[0]) s = 1;
cars[id].push_back({t,s});
}
vector<Event> events;
for(auto& it : cars)
{
auto& ets = it.second;
sort(ets.begin(), ets.end());
int k = 0;
for(int i = 0; i < ets.size(); ++i)
{
if(ets[i].status == 0)
{
if(i+1 < ets.size() && ets[i+1].status == 1) //状态合法
{
ets[k++]=ets[i];
ets[k++] = ets[i+1];
++i;
}
}
}
ets.erase(ets.begin()+k, ets.end());
for(int i = 0; i < k; ++i) events.push_back(ets[i]);
}
sort(events.begin(), events.end());
int k = 0, sum = 0;
while(m--)
{
int hh,mm,ss;
scanf("%d:%d:%d", &hh, &mm, &ss);
int t = hh * 3600+mm*60+ss;
while(k < events.size() && events[k].tm <= t)
{
if(events[k].status == 0) ++sum;
else --sum;
++k;
}
printf("%d\n", sum);
}
int maxt = 0;
for(const auto& it: cars)
{
maxt = max(maxt, get(it.second));
}
vector<string> res;
for(auto& it: cars)
{
if(get(it.second) == maxt) res.push_back(it.first);
}
sort(res.begin(), res.end());
for(int i = 0; i < res.size(); ++i) printf("%s ", res[i].c_str());
printf("%02d:%02d:%02d\n", maxt/3600, maxt%3600/60, maxt%60);
return 0;
}