题目大意就是给定N个车辆进出校园的信息,给定K个查询,每个查询给出一个时刻,要求输出此时校园内的车辆总数。
最后输出停车时间最长的车牌号,如果车牌号不唯一,按字典顺序输出每个车牌号,最后输出最长停车时间。
思路:首先,把每个车辆信息记录下来,并按时间递增排序。
然后,用unordered_map保存<当前车牌号,index>,通过in ,out配对的方式,剔除无效车辆信息。如果配对成功,就用map保存<车牌号,停车时间>,统计有效信息个数以及更新最长停车时间,最后移除unordered_map<当前车牌号,index>,开始下一次配对。
最后,按车辆信息是否有效,把所有的有效车辆信息移到数组最左边。
然后根据每个查询输出对应结果。最后输出map中的最大停车时间的车牌号。
注意点:一辆车可能出入校园好多次,停⻋的时间应该取之和
STL:unordered_map,map,sort。忘记使用map(自排序+去重),导致最后一个测试点卡了三个小时...我哭!
#include"iostream" #include"algorithm" #include"unordered_map" #include"map" using namespace std; struct Car { string plate_number,status; int time;// 秒 bool flag = false;//表示车辆信息是否有效,初始为false } car[10200]; bool cmp(const Car& a,const Car& b) { if(a.flag == true && b.flag == true) return a.time < b.time; else return a.flag > b.flag;//有效信息全部排左边 } int main() { int N,K,hh,mm,ss; scanf("%d%d",&N,&K); for(int i = 0; i < N; ++i) { cin>>car[i].plate_number;//车牌号 scanf("%d:%d:%d",&hh,&mm,&ss); car[i].time = hh*3600+mm*60+ss;//时间 cin>>car[i].status;//状态 car[i].flag = true;//置为有效信息 } sort(car,car+N,cmp);//全部信息按时间递增排序 unordered_map<string,int> um1;//用于保存<车牌号,index> map<string,int> parkTime;//用于保存<plate_number,parktime> //这里忘记改成 map(自排序+去重)了,导致最后一个测试样例没过!!看了我三个小时...我哭!!! int cnt = 0,maxTime = -1;//统计有效信息个数cnt,最长停车时间maxTime for(int i = 0; i < N; ++i) { if(um1.count(car[i].plate_number) == 0) {//当前车牌号不存在 if(car[i].status == "out") car[i].flag = false; //第一次是out,肯定为无效信息 else um1[car[i].plate_number] = i; //第一次是in,保存<车牌号,index> } else { //当前车牌号存在 if(car[i].status == "in") { //又是in car[um1[car[i].plate_number]].flag = false;//上一个in是无效信息的 um1[car[i].plate_number] = i;//并重置<车牌号,index> } else { //是out,则与上一个in配对成功,统计停车时间,然后移除<车牌号,index> if(parkTime.count(car[i].plate_number) == 0) parkTime[car[i].plate_number] = 0;//parkTime中当前车牌号不存在,置零 parkTime[car[i].plate_number] += (car[i].time - car[um1[car[i].plate_number]].time);//保存<plate_number,parktime> maxTime = max(maxTime,parkTime[car[i].plate_number]);//记录最大停车时间 um1.erase(car[i].plate_number);//移除<车牌号,index> cnt+=2; } } } for(auto it = um1.begin(); it!= um1.end(); ++it)//处理剩余无效信息 car[it->second].flag = false; sort(car,car+N,cmp);//全部有效信息排在左边 int ans = 0,now = 0;//记录上一次访问位置 for(int i = 0; i < K; ++i) {//K次查询 scanf("%d:%d:%d",&hh,&mm,&ss); int time = hh*3600+mm*60+ss; while(now < cnt&&car[now].time <= time) { if(car[now++].status == "in") ans++; else ans--; } printf("%d\n",ans); } for(auto it = parkTime.begin(); it != parkTime.end(); ++it) { if(it->second == maxTime) cout<<it->first<<" "; } printf("%02d:%02d:%02d\n",maxTime/3600,maxTime%3600/60,maxTime%60); return 0; }