PAT A1095 Cars on Campus
思路:通过把时间转化为秒的形式,先记录所有输入的记录,再根据 id 以及 time 进行排序。对于同一个 id 的记录进行相邻的 in 和 out 的查找,并将查找结果存入 valid 数组中,同时增加这一对记录的停留时间到哈希表中,更新最大停留时间。剩下的 K 次查询,用 now 处理至当前查询时间,numCar 作为车辆记录数。由于每次查询都是根据时间进行的,即 now 和 numCar 是连续变化的。
#include<iostream>
#include<algorithm>
#include<string>
#include<map>
#include<cstdio>
using namespace std;
const int MAXN = 10005;
const int MAXK = 80005;
int N, K;
typedef struct {
string id, status;
int time;
} Record;
Record all[MAXN], valid[MAXN];
map<string, int> parkTime;
int TimeToInt(int hh, int mm, int ss) {
return hh * 3600 + mm * 60 + ss;
}
bool cmpIdTime(Record a, Record b) {
if(a.id != b.id) return a.id < b.id;
return a.time < b.time;
}
bool cmpTime(Record a, Record b) {
return a.time < b.time;
}
int main() {
cin >> N >> K;
int hh, mm, ss;
for(int i = 0; i < N; i++) {
cin >> all[i].id;
scanf("%d:%d:%d", &hh, &mm, &ss);
cin >> all[i].status;
all[i].time = TimeToInt(hh, mm, ss);
}
sort(all, all + N, cmpIdTime);
int maxTime = -1, validNum = 0;
for(int i = 0; i < N - 1; i++) {
if(all[i].id == all[i + 1].id &&
all[i].status == "in" &&
all[i + 1].status == "out") {
valid[validNum++] = all[i];
valid[validNum++] = all[i + 1];
int inTime = all[i + 1].time - all[i].time;
if(parkTime.count(all[i].id) == 0) {
parkTime[all[i].id] = 0;
}
parkTime[all[i].id] += inTime;
maxTime = max(maxTime, parkTime[all[i].id]);
}
}
sort(valid, valid + validNum, cmpTime);
int now = 0, numCar = 0;
for(int i = 0; i < K; i++) {
scanf("%d:%d:%d", &hh, &mm, &ss);
int time = TimeToInt(hh, mm, ss);
while(now < validNum && valid[now].time <= time) {
if(valid[now].status == "in") numCar++;
else numCar--;
now++;
}
cout << numCar << endl;
}
for(auto &pt : parkTime) {
if(pt.second == maxTime)
cout << pt.first << " ";
}
printf("%02d:%02d:%02d", maxTime / 3600, maxTime % 3600 / 60, maxTime % 60);
return 0;
}