题意:给出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. L169 Komodo dragons

    Komodo dragons live on a handful of islands in Indonesia, but their reputation has spread far and wi ...

  2. 自己定义的Excetpion继承哪个异常有什么讲究?[待解答]

    try catch的地方需要用到一个自定义的DBException,如下: 于是我就自定义了一个DBException,继承Excetpion,以父类Exception构造器创建构造器: DBExce ...

  3. 【dlbook】优化

    [神经网络优化的挑战] 一.病态: 虽然学习率很小,而且梯度大,但是由于Hessian阵的病态,二次项比一次项还要大,梯度下降事实上并不一定能下降,反而有可能上升.因此需要将学习率调低. 表现:梯度很 ...

  4. ffmpeg命令汇总

    1. 查看ffmpeg信息: ldd `which ffmpeg` ffmpeg -filters ffmpeg -h filter=drawtext man ffmpeg ffmpeg --help ...

  5. d3.js入门之DOM操作

    上篇成功在vue项目中把d3跑起来了,接下来对d3的基本操作做个汇总: 一.d3元素选择器 d3.select(".skill"):选择第一个类名为skill的元素并返回这个元素对 ...

  6. Android 贝塞尔曲线解析

    相信很多同学都知道"贝塞尔曲线"这个词,我们在很多地方都能经常看到.利用"贝塞尔曲线"可以做出很多好看的UI效果,本篇博客就让我们一起学习"贝塞尔曲线 ...

  7. Linux操作系统设置SSH及SFTP通过密钥登录

    如果你使用过Linux操作系统的VPS或其他服务器,可能在登录时经常会提示你有多少次登录失败的记录. 这种登录失败的记录实际上也就是攻击者使用脚本自动扫描全网的IP然后进行筛选和测试,最终脚本会使用内 ...

  8. 基于 od 窗口的anti

    虽然 odadvance 这类的插件 , 使用驱动将 od 的窗口 进行 隐藏,使用enumwindow ,无法枚举到od的窗口, 但是依然可以 使用r3 的方法 , 对od 窗口检测 之后可以使用 ...

  9. NSLayoutConstraint 布局,配合简单的动画效果

    demo地址 :链接: http://pan.baidu.com/s/1c00ipDQ 密码: mi4c 1 @interface ViewController () @property (nonat ...

  10. 重温CLR(十一) 枚举类型、位标志和数组

    枚举类型 枚举类型(enumerated types)定义了一组"符号名称/值"配对.例如,以下Color类型定义了一组符号,每个符号都标识一种颜色: internal enum ...