题意:给出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. PHP获取随机数的函数rand()和mt_rand()

    rand()函数用户获取随机数,具体用法如下: rand()可以设置0个参数或者两个参数,如rand($min,$max),$min表示从XX开始取值,$max表示最大只能为XX 例如: <?p ...

  2. windows下gvim搭建IDE

    原文转载自:手把手教你把Vim改装成一个IDE编程环境(图文) 如侵犯您的版权,请联系:windeal12@qq.com By: 吴垠 Date: 2007-09-07 Version: 0.5 Em ...

  3. Android 开发技术选型(博客,新闻,阅读类)

    前言 最开始学习写应用的时候,发现类聚合数据这个平台可以提供一些免费数据接口,于是写了个人的第一个应用-– JuheNews,当时的知识储备稍显粗糙,虽然现在的知识也不咋滴,但是相对之前而言还是有些进 ...

  4. $.ajax 的速度要快于 angular 里 $http (个别情况)

    $.ajax: $http:

  5. Selenium+PhantomJS使用初体验

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

  6. Pandas库常用函数和操作

    1. DataFrame 处理缺失值  dropna() df2.dropna(axis=0, how='any', subset=[u'ToC'], inplace=True) 把在ToC列有缺失值 ...

  7. BitArray类的使用--(转换二进制数的内部实现过程)

    BitArray类用来处理位集合. 它和ArrayList十分类似,可以动态调整大小,可以在需要的时候添加二进制位而不用担心数组越界的问题.(所以本质它也是集合里套一个数组,可能是线性数组) 什么是位 ...

  8. learn go anonymous function

    package main // 参考文档: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.8.md im ...

  9. 【剑指offer】数字在排序数组中出现的次数,C++实现

    原创博文,转载请注明出处! # 题目 # 思路 利用二分查找法,查找元素k在排序数组中第一次出现的位置m及最后一次出现的位置n,m-n+1即为元素k再排序数组中出现的次数.       二分查找法在数 ...

  10. 使用css固定table第一列

    .table{width:100%;overflow-x: scroll;background-color:#7c95b5;} .fixedTable{width:160%;text-align: c ...