码迷,mamicode.com
首页 > 其他好文 > 详细

1095 Cars on Campus (30 分)

时间:2021-02-19 12:56:09      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:因此   一个   scanf   相同   res   stat   turn   查询   结构   

带模拟。

题意

给出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\n",maxtime/3600,maxtime%3600/60,maxtime%3600%60);
    //system("pause");
    return 0;
}

1095 Cars on Campus (30 分)

标签:因此   一个   scanf   相同   res   stat   turn   查询   结构   

原文地址:https://www.cnblogs.com/fxh0707/p/14408287.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!