原题地址:https://pintia.cn/problem-sets/994805342720868352/problems/994805371602845696
参考代码:https://www.liuchuo.net/archives/2951
这道题我开始想了很久,比如如何构造时间加减函数,把车牌号与某一个散列值对应。
后来看了别人的代码:
把所有时间变成秒;
两次排序,第一次对车牌排序,去除无效的记录;
第二次对时间排序,按次序遍历即可获得每个Query的车辆数。用flag=±1即可计算每段时间的车辆数。
注意可能有的车多次进出,计算最长停车时间时要累计。
下面是我的代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
/*
A1095 Cars on Campus
这道题我开始想了很久,比如如何构造时间加减函数,把车牌号与某一个散列值对应。
后来看了别人的代码:
把所有时间变成秒;
两次排序,第一次对车牌排序,去除无效的记录;
第二次对时间排序,按次序遍历即可获得每个Query的车辆数。用flag=+-1即可计算每段时间的车辆数
*/
//每条记录
struct node {
string name = "";
int flag;
int time;
};
//每辆车
struct node1
{
string name = "";
int Ptime;
};
bool cmp1(node a, node b) {
if (a.name != b.name)
return a.name < b.name;
else
return a.time < b.time;
}
bool cmp2(node a, node b) {
return a.time < b.time;
}
int main() {
//----------Input-----------
//N the number of records, and K the number of queries
int N, K;
scanf("%d %d", &N, &K);
vector<node> ini_seq(N),seq;
string num,status;
for (int i = 0; i < N; i++) {
int h, m, s,time;
cin >> num;
scanf("%d:%d:%d", &h, &m, &s);
cin >> status;
time = h * 3600 + m * 60 + s;
ini_seq[i].name = num;
ini_seq[i].time = time;
ini_seq[i].flag = status == "in" ? 1 : -1;
}
//-----------Remove invalid records-------------
sort(ini_seq.begin(), ini_seq.end(), cmp1);