思路:两次排序:第一次通过车牌排序,然后判断数据是否合法,并找出最长的停车时间;第二次通过时间排序,按时间统计出车辆数。
代码:
#include<cstdio>
#include<string>
#include<vector>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
class CAR{
public:
string Pnum;
int time;
int status;
bool isValid;
CAR(string num1,int time1,int status1){
Pnum = num1;
time = time1;
status = status1;
isValid = false;
}
};
int main(){
int N, K;
scanf("%d %d", &N, &K);
vector<CAR> parking;
string t_pnum;
int t_hour, t_min, t_sec;
string t_status;
for (int i = 0; i < N;i++){
cin >> t_pnum;
scanf("%d:%d:%d", &t_hour, &t_min, &t_sec);
int tempt = t_hour * 3600 + t_min * 60 + t_sec;
cin >> t_status;
int temps = t_status[0] == 'i' ? 0 : 1;
parking.emplace_back(t_pnum, tempt, temps);
}
sort(parking.begin(), parking.end(), [](CAR x, CAR y){
if(x.Pnum.compare(y.Pnum)==0){
return x.time < y.time;
}else{
return x.Pnum.compare(y.Pnum)<0;
}
});
int maxlength = 0;
map<string, int> lenth;
vector<string> longest;
for (int i = 0; i+1 < parking.size();++i){
if(parking[i].status == 0){
if(parking[i+1].status == 1 && parking[i].Pnum.compare(parking[i+1].Pnum) == 0){
auto it = lenth.find(parking[i].Pnum);
if(it!=lenth.end())
{
it->second += (parking[i + 1].time - parking[i].time);
}else{
lenth[parking[i].Pnum] = (parking[i + 1].time - parking[i].time);
}
if(lenth[parking[i].Pnum] > maxlength){
maxlength = lenth[parking[i].Pnum];
}
parking[i].isValid = parking[i + 1].isValid = true;
}
}
}
for (auto it = lenth.begin(); it != lenth.end();++it){
if(it->second == maxlength){
longest.push_back(it->first);
}
}
sort(longest.begin(), longest.end(), [](string x, string y) {
return x.compare(y) < 0;
});
sort(parking.begin(), parking.end(), [](CAR x, CAR y) {
if(x.time == y.time){
return x.Pnum.compare(y.Pnum) < 0;
}else{
return x.time < y.time;
}
});
int j = 0;
int numCar = 0;
for (int i = 0; i < K;i++){
int hh, mm, ss;
scanf("%d:%d:%d", &hh, &mm, &ss);
int temp = hh * 3600 + mm * 60 + ss;
for (; j<parking.size() && temp >= parking[j].time;j++){
if(parking[j].isValid){
if(parking[j].status == 0){
numCar++;
}else{
numCar--;
}
}
}
cout << numCar << endl;
}
// for (auto it = parking.begin(); it != parking.end();it++){
// cout << it->Pnum << " " << it->status << " " << it->time << " " << it->isValid<<endl;
// }
for (auto it = longest.begin(); it != longest.end();it++){
cout << *it << " ";
}
int hh, mm, ss;
hh = maxlength / 3600;
maxlength %= 3600;
mm = maxlength / 60;
maxlength %= 60;
ss = maxlength;
printf("%02d:%02d:%02d", hh, mm, ss);
return 0;
}
C++语法复习
- vector
- map
- find() 找不到返回 .end()
- map迭代器 it->first是key,it->second是value
- lambda
网友评论