1095 Cars on Campus

题目大意就是给定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;
}

猜你喜欢

转载自www.cnblogs.com/keep23456/p/12295550.html