题意:给出N量车的车牌号,进出的时间,进/出状态。然后给出若干个查询,要求计算在每一查询时刻校园内停着的汽车数量,最后输出这一天中停放时间最长的车辆(若车不止一辆,则按字典序输出)以及停放时间。注:查询时间是按时间增序给出的。

思路:【这道题还不错】

1.首先,根据车牌号以及时间顺序将输入记录进行排序(cmp1),筛选出一进一出配对的合法记录。筛选的过程中同时记录一辆车的停车时长。车牌号以及停车时长可以用map建立映射关系。

2.然后,统计一天内(从00:00:00~23:59:59)每个时刻校园内的汽车数量,记录在car[hh][mm][ss]中,初始化为0。由于已经预处理好了,对于任意一个查询,都是O(1)的。怎么计算hh:mm:ss时刻的汽车数量呢?首先需要对第1步筛选出的合法记录根据时间顺序重新进行排序(cmp2),然后利用下面这么一个循环进行统计,看代码:

,mm=,ss=,cnt=;//hh:mm:ss为起始时间,cnt表示当前时刻校园内的汽车数量
for(对于每一个合法记录i){
    while(hh<validRec[i].hh || mm<validRec[i].mm || ss<validRec[i].ss){//当跳出while循环时,hh:mm:ss恰是当前记录validRec[i]的(进/出)时间
        car[hh][mm][ss] = cnt;//记录下每一个时刻的汽车数量
        ss++;
        ){
            ss=;
            mm++;
        }
        ){
            mm=;
            hh++;
        }
    }
    if(validRec[i].status==IN) cnt++;//根据当前记录的进/出状态,更新cnt。这样的话,在进入下一个记录(i+1)时,cnt就是区间[i状态时刻,i+1状态时刻)的汽车数量
    else cnt--;
 }

(ps:这种写法在随着时间流逝而状态发生变化的情形下屡试不爽,非常好用,可以当做模板记住。我的灵感来源于1016 Phone Bills。)

需要注意的是,遍历完所有合法记录之后,上面的时间(hh:mm:ss)停留在最后一个合法记录的出门时刻,而没有真正统计到23:59:59这个时刻。即在最后一个记录的出门时间~23:59:59这个时间段的car[][][]默认为0,没有再更新cnt了。这个不用担心,由于题目限定合法记录都是“IN/OUT”配对的,也就是说,汽车最后总是全部OUT的,即最后一个记录的出门时间~23:59:59这个时间段内校园内已经没有车了。因此,后面这段时间就不用再更新cnt了。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
using namespace std;
;
;
;
struct Record{
    ];
    int hh,mm,ss,time;
    int status;
}rec[maxn],validRec[maxn];
][][]={};
map<string,int> mp;//车牌号与对应停车时长的映射
vector<string> ans;
;

bool cmp1(Record a,Record b){
    ) ;
    else return a.time<b.time;
}

bool cmp2(Record a,Record b){
    return a.time<b.time;
}

int main()
{
    //freopen("pat.txt","r",stdin);
    int n,m;
    scanf("%d%d",&n,&m);
    ];
    ;i<n;i++){
        scanf("%s %d:%d:%d %s",rec[i].palte,&rec[i].hh,&rec[i].mm,&rec[i].ss,s);
        rec[i].time=rec[i].hh*+rec[i].mm*+rec[i].ss;
        ) rec[i].status=IN;
        else rec[i].status=OUT;
    }
    sort(rec,rec+n,cmp1);
    ,curr=,len=;
    while(curr<n){
         &&
           rec[pre].status==IN && rec[curr].status==OUT){
            int parking_time=rec[curr].time-rec[pre].time;
            string str=string(rec[pre].palte);
            mp[str]+=parking_time;
            if(mp[str] > longestParkTime){
                longestParkTime=mp[str];
                ans.clear();
                ans.push_back(str);
            }else if(mp[str] == longestParkTime){
                ans.push_back(str);
            }
            validRec[len++]=rec[pre];
            validRec[len++]=rec[curr];

            pre=pre+;
            curr=curr+;
        }else{
            pre=curr;
            curr=curr+;
        }
    }
    sort(validRec,validRec+len,cmp2);
    ,mm=,ss=,cnt=;
    ;i<len;i++){
        while(hh<validRec[i].hh || mm<validRec[i].mm || ss<validRec[i].ss){
            car[hh][mm][ss] = cnt;
            ss++;
            ){
                ss=;
                mm++;
            }
            ){
                mm=;
                hh++;
            }
        }
        if(validRec[i].status==IN) cnt++;
        else cnt--;
    }//for
    ;i<m;i++){
        scanf("%d:%d:%d",&hh,&mm,&ss);
        printf("%d\n",car[hh][mm][ss]);
    }
    for(auto str:ans) printf("%s ",str.c_str());
    printf(,longestParkTime%/,longestParkTime%%);
    ;
}

1095 Cars on Campus的更多相关文章

  1. PAT甲级1095. Cars on Campus

    PAT甲级1095. Cars on Campus 题意: 浙江大学有6个校区和很多门.从每个门口,我们可以收集穿过大门的汽车的进/出时间和车牌号码.现在有了所有的信息,你应该在任何特定的时间点告诉在 ...

  2. PAT 1095 Cars on Campus

    1095 Cars on Campus (30 分) Zhejiang University has 8 campuses and a lot of gates. From each gate we ...

  3. PAT甲级——1095 Cars on Campus (排序、映射、字符串操作、题意理解)

    本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/93135047 1095 Cars on Campus (30 分 ...

  4. 1095 Cars on Campus——PAT甲级真题

    1095 Cars on Campus Zhejiang University has 6 campuses and a lot of gates. From each gate we can col ...

  5. PAT (Advanced Level) Practise - 1095. Cars on Campus (30)

    http://www.patest.cn/contests/pat-a-practise/1095 Zhejiang University has 6 campuses and a lot of ga ...

  6. 1095. Cars on Campus (30)

    Zhejiang University has 6 campuses and a lot of gates. From each gate we can collect the in/out time ...

  7. 1095 Cars on Campus(30 分

    Zhejiang University has 8 campuses and a lot of gates. From each gate we can collect the in/out time ...

  8. 1095 Cars on Campus (30)(30 分)

    Zhejiang University has 6 campuses and a lot of gates. From each gate we can collect the in/out time ...

  9. PAT (Advanced Level) 1095. Cars on Campus (30)

    模拟题.仔细一些即可. #include<cstdio> #include<cstring> #include<cmath> #include<algorit ...

  10. PAT甲题题解-1095. Cars on Campus(30)-(map+树状数组,或者模拟)

    题意:给出n个车辆进出校园的记录,以及k个时间点,让你回答每个时间点校园内的车辆数,最后输出在校园内停留的总时间最长的车牌号和停留时间,如果不止一个,车牌号按字典序输出. 几个注意点: 1.如果一个车 ...

随机推荐

  1. JWT的详细简介

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场 ...

  2. FusionCharts制作实时刷新图

    转自:http://yklovejava-163-com.iteye.com/blog/1889949 下面介绍的是用FusionCharts制作实时刷新图的过程(FusionCharts确实太好用了 ...

  3. c# JScriptProvider包装

    using System; using System.CodeDom.Compiler; using System.Reflection; using System.Web.UI; using Mic ...

  4. html与css与JavaScript的关系

    “HTML是网页的结构,CSS是网页的外观,而JavaScript是页面的行为.” 1)HTML—Hypertext Markup Language. 超文本标记语言.用来描述网页的语言. <h ...

  5. 实现DQN算法玩CartPole

    先安装tensorflow 1.2版本和python 3.6, 接着安装: numpy-1.13.1+mkl-cp36-cp36m-win_amd64.whl 的版本,这个是windows下的,如果l ...

  6. [Python] dict字典排序和多条件排序

    利用lambda实现排序:要实现多条件排序,只需要依次指定排序的标准,具体实现如下 counter = {'是': 1, '不是': 1, '你': 3} counter_list = sorted( ...

  7. python使用progressbar显示进度条

    progressbar安装: pip install progressbar 用法一 # -*- coding=utf-8 -*- import time from progressbar impor ...

  8. ubuntu创建Centos7镜像&&配置运行环境

    1. 下载centos7镜像 sudo docker pull centos:7 2. 启动centos7容器并挂载本地目录 sudo docker -it -v /home/software:/ho ...

  9. Linux usleep for shell

    /**************************************************************************** * Linux usleep for she ...

  10. [转载][QT][SQL]sql学习记录4_sqlite约束

    转载自:定义以及示例请见 : http://www.runoob.com/sqlite/sqlite-constraints.html SQLite 约束 约束是在表的数据列上强制执行的规则.这些是用 ...