如果没有考虑在两条记录中间多次查询的情况,测试点2和4会出错;
如果最后的输出没有按字母排序,测试点5会出错
以上是我遇到的问题,以下是AC代码:
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <unordered_map>
#include <algorithm>
using namespace std;
struct Record{
string plateNumber;
int time;
bool in;
Record(int t){
this->time = t;
}
Record(){}
};
vector<Record> records;
bool cmp(Record a,Record b){
return a.time < b.time;
}
bool cmp1(string a,string b){
return a < b;
}
int main(){
int n,k;
scanf("%d %d",&n,&k);
// n : 记录数
// k : 查询请求数
for(int i = 0;i < n;i++){
Record temp;
string state;
int hh,mm,ss;
temp.plateNumber.resize(8);
state.resize(4);
scanf("%s %d:%d:%d %s",&temp.plateNumber[0],&hh,&mm,&ss,&state[0]);
temp.time = hh * 3600 + mm * 60 + ss;
if(state[0] == 'i')
temp.in = true;
else
temp.in = false;
records.push_back(temp);
}
sort(records.begin(),records.end(),cmp);
// 先遍历一遍整个vector,将所有in和out不匹配的记录删除
vector<int> recordsNeedToDelete;
unordered_map<string,int> toClear;
for(int i = 0;i < n;i++){
if(records[i].in == true){ // 该记录是in,若前面已经出现过一次in,则将前面出现的in记录删除,把这条in记录放进map里;若前面没有出现过,则直接将这条记录放入map
if(toClear.find(records[i].plateNumber) != toClear.end()){ // 前面出现过in
recordsNeedToDelete.push_back(toClear.find(records[i].plateNumber)->second);
toClear[records[i].plateNumber] = i;
}else{
toClear[records[i].plateNumber] = i;
}
}else{ // 该记录是out,若前面出现过in了,则将前面的in从map拿走;若前面没有出现过,则应删除这条记录
if(toClear.find(records[i].plateNumber) != toClear.end()){
toClear.erase(toClear.find(records[i].plateNumber));
}else{
recordsNeedToDelete.push_back(i);
}
}
}
while(!toClear.empty()){
recordsNeedToDelete.push_back(toClear.begin()->second);
toClear.erase(toClear.begin());
}
sort(recordsNeedToDelete.begin(),recordsNeedToDelete.end());
int t = 0;
for(int i = 0;i < n;i++){
if(t < recordsNeedToDelete.size() && recordsNeedToDelete[t] == i){
t++;
continue;
}
records[i - t] = records[i];
}
//整理完成,此时records里面全是对应好的记录了
unordered_map<string,int> campus; // 停车场:车牌号、进入时间
unordered_map<string,int> rec; // 对每辆车总共停留时间的记录
int len = records.size() - t - 1;
int hh,mm,ss;
int q = 0;
scanf("%d:%d:%d",&hh,&mm,&ss);
int query = hh * 3600 + mm * 60 + ss;
for(int i = 0;i <= len;i++){
while(records[i].time > query && q < k){
printf("%d\n",campus.size());
q++;
if(q < k){
scanf("%d:%d:%d",&hh,&mm,&ss);
query = hh * 3600 + mm * 60 + ss;
}
}
if(records[i].in == true){ // 有车进来
campus[records[i].plateNumber] = records[i].time;
}else{ // 有车出去
if(rec.find(records[i].plateNumber) != rec.end()){ // 这辆车不是第一次进来
rec[records[i].plateNumber] += records[i].time - campus[records[i].plateNumber];
}else{
rec[records[i].plateNumber] = records[i].time - campus[records[i].plateNumber];
}
campus.erase(campus.find(records[i].plateNumber));
}
}
while(q < k){
printf("0\n");
q++;
}
set<string> maxTimeCars;
unordered_map<string,int>::iterator it1 = rec.begin();
int maxTime = 0;
while(it1 != rec.end()){
if(it1->second > maxTime){
maxTime = it1->second;
maxTimeCars.clear();
maxTimeCars.insert(it1->first);
}else if(it1->second == maxTime){
maxTimeCars.insert(it1->first);
}
it1++;
}
int h,m,s;
h = maxTime / 3600;
maxTime = maxTime - h * 3600;
m = maxTime / 60;
s = maxTime - m * 60;
while(!maxTimeCars.empty()){
printf("%s ",maxTimeCars.begin()->c_str());
maxTimeCars.erase(maxTimeCars.begin());
}
printf("%02d:%02d:%02d",h,m,s);
system("pause");
return 0;
}