• 1095 Cars on Campus (30 分)


    带模拟。

    题意

    给出N条记录,每条记录给出一辆车的车牌号、当前时刻以及出入校情况(入校(in)还是出校(out))。然后给出K个查询,每个查询给出一个时刻,输出在这个时刻校园内的车辆数。
    查询完毕后输出在学校内停留时间最长的车辆的车牌号(如果有多个,就一并输出)和对应的停留时间。
    注意:

    • 每个 in 记录都与按时间顺序排列的同一辆车的下一条记录配对,但前提是这条记录是 out。
    • 所有未与 out 记录配对的 in 记录以及未与 in 记录配对的 out 记录都必须忽略。
    1. 定义结构体类型Node,记录单条记录的信息,即车辆的车牌号、记录产生的时刻;以及记录类型(即in或者out)。为了处理时间方便,这里把时间统一转换为以s为单位,样用一个int型即可满足存放要求。定义一个数组all,用以存放所有记录;定义一个数组valid,用以存放有效记录。同时,还需要一个map<string, int> mp,用来记录每辆车在校园中停留的总时长。
    2. 将所有记录存于all数组,然后将其先按车牌号从小到大排序,若车牌号相同,则按时间值的从小到大排序。
    3. 遍历所有记录,查找有效记录,并将其存入valid数组。由于有效记录必须是相邻的,因此如果当前遍历到的是i号记录,那么就判断它的车牌号和i+1号记录的车牌号是否是同一个车牌号,并且是否满足i号的是“in” 记录、i+1号的是“out”记录。如果是,就说明这两条记录是有效记录,将它们存入valid 数组,同时令这辆车的总停留时间parkTimeall[i].id]增加两条记录的时间之差。
    4. 待把所有有效记录存入valid 数组后,接下来应把valid 数组按照时间顺序从小到大排序,然后进入查询阶段。由于查询的时刻是按照时间顺序递增的,因此可以设置一个变量now,用以指向valid数组里面的记录,使得now指向的记录的时刻不超过本次欲查询的时刻;同时设置一个变量numCar,以记录当前校园内的车辆数。显然,当valid[now]为“in”时,numCar加1;而当valid[now]是“out” 时,numCar减1。
    5. 找出最长总停留时间,输出总停留时间等于maxTime的车辆车牌号。
    const int N=10010;
    struct Node
    {
        string id;
        string state;
        int tim;
        bool operator<(const Node &W) const
        {
            return tim < W.tim;
        }
    }a[N],valid[N];
    map<string,int> mp;
    int cnt;
    int maxtime;
    int n,m;
    
    bool cmp(Node &a,Node &b)
    {
        if(a.id == b.id) return a.tim < b.tim;
        return a.id < b.id;
    }
    
    int calc(int hh,int mm,int ss)
    {
        return hh*3600+mm*60+ss;
    }
    
    int main()
    {
        cin>>n>>m;
    
        for(int i=0;i<n;i++)
        {
            int hh,mm,ss;
            a[i].id.resize(7),a[i].state.resize(3);
            scanf("%s %d:%d:%d %s",&a[i].id[0],&hh,&mm,&ss,&a[i].state[0]);
            a[i].tim=calc(hh,mm,ss);
        }
    
        sort(a,a+n,cmp);
        
        for(int i=0;i<n-1;i++)
        {
            if(a[i].id == a[i+1].id && a[i].state[0] == 'i' && a[i+1].state[0] == 'o')
            {
                valid[cnt++]=a[i];
                valid[cnt++]=a[i+1];
                if(mp.count(a[i].id) == 0) mp[a[i].id]=0;
                mp[a[i].id]+=a[i+1].tim-a[i].tim;
            }
        }
    
        sort(valid,valid+cnt);
    
        int k=0;
        int car=0;
        while(m--)
        {
            int hh,mm,ss;
            scanf("%d:%d:%d",&hh,&mm,&ss);
            int t = hh*3600+mm*60+ss;
    
            while(k<cnt && valid[k].tim <= t)
            {
                if(valid[k].state[0] == 'i') car++;
                else car--;
                k++;
            }
            cout<<car<<endl;
        }
        
        for(auto t:mp)
            maxtime=max(maxtime,t.se);
        for(auto t:mp)
            if(t.se == maxtime)
                cout<<t.fi<<' ';
            
        printf("%02d:%02d:%02d
    ",maxtime/3600,maxtime%3600/60,maxtime%3600%60);
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    基于ObjectCache的应用
    数学趣题——验证角谷猜想
    数学趣题——递归法寻找最小值
    数学趣题——寻找同构数
    数学趣题——表示成两个数的平方和
    数学趣题——马克思手稿中的数学题
    数学趣题——具有特殊性质的数
    数学趣题——验证四方定理
    数学趣题——连续整数固定和问题
    数学趣题——验证尼克彻斯定理
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14408287.html
Copyright © 2020-2023  润新知