题意:给出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. Ubuntu 13.10 如何修改背景色--豆沙绿

    如何修改Ubunut 13.10的窗口背景色,在网上找到了多资料,安装了dconf,Unity Tweak Tool,GNOME Color Chooser都无法修改背景色. 最后,还是直接去修改主题 ...

  2. 解析xml节点属性及子节点内容

    xml样例 <microNearlyThreeYearsOverdueInfo subReportType="13204" subReportTypeCost="9 ...

  3. Linux网络编程IPv4和IPv6的inet_addr、inet_aton、inet_pton等函数小结

    知识背景: 210.25.132.181属于IP地址的ASCII表示法,也就是字符串形式.英语叫做IPv4 numbers-and-dots notation. 如果把210.25.132.181转换 ...

  4. echarts-detail---散点图

    data4 = [{ xAxis: result.AvgEvaluate, seriesId: ', name: '基干360综合分' }, { yAxis: evalue, seriesId: ', ...

  5. 简单说说什么是Restful

    在确定要把自己的服务创建成RESTFUL之前,要明白什么样的服务什么是RESTFUL service(https://en.wikipedia.org/wiki/Representational_st ...

  6. RxJava 1.x 笔记:变换型操作符

    在写这几篇 RxJava 笔记时,发现官方文档很久都没有更新啊. 一些前辈两年前写的学习笔记内容跟现在也基本一致,RxJava 2.x 的文档也基本没有,不知道是不是缺实习生. 本文内容为 RxJav ...

  7. 开源一款资源分享与下载工具 —— 电驴(eMule)

    这里分享一款资源分享与下载工具--电驴,其实严格来说,应该叫电骡,这是我维护的版本,eMuleVeryCD版本,VeryCD是一个不错的资源分享网站:http://www.verycd.com/.大概 ...

  8. Selenium+PhantomJS使用初体验

    抓取使用Ajax技术完成的网页内容时可以使用Selenium+PhantomJS技术 1.pip install selenium 2.下载Phantomjs不需要用pip   武汉科技大学首页有一块 ...

  9. iOS-分组UITableView删除崩溃问题(当删除section中最后一条数据崩溃的情况)

    错误: The number of sections contained in the table view after the update (1) must be equal to the num ...

  10. 关于鼠标不敏感导致自以为ubuntu很怪的问题

    你要相信自己拥有的确实是一个垃圾鼠标,而不要以为复制和粘贴有感觉控制不住.