PAT 1095 Cars on Campus 模拟

题目链接:

PAT1095

题意 :

有一个学校,每天会有很多车进出;给出N条车辆进出情况和M条询问

每条询问输出当前校园有多少辆车,时间从0点24点  最后输出停留最久的车的车牌号和停留时间,  如果有多个,则按字典序输出车牌号

注意  必须要使得所有数据保证以下情况,否则为无效数据:

1 最开始校园里是没车的

2 最后不能有车停留

3 同一辆车连续多次进入 只有最后一个是正确的

4 同一辆车连续多次出去 只有最开始一个是正确的

题解思路:

考察基本功

用map来记录每一个车牌号的下标

首先将所有语句按时间排序  并保存所有询问时间

遍历一次删除不合法语句

再遍历一次 设置一个询问指针

当时间符合要求则输出当前车辆数

用set来保存所有停留最久的车牌号

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<set>
#include<algorithm>
#define maxn 10050
using namespace std;
struct node2         //每个车的状态
{
    string id;        //  车牌
    int state;        //  1:in  0:out
    int sum;
    int in_time;
    int loc;          // 上一个in语句的位置
} ID[maxn];

struct node          //所有语句信息
{
    int time;
    string id;
    int state;
    int flag;        // 该语句是否正确
} s[maxn];

map<string,int>q;
set<string>w;

int cmp(node a,node b)
{
    return a.time<b.time;
}

int main()
{
//    freopen("in.txt","r",stdin);
    int n,m;
    int query[maxn*8];
    string str1,str2;
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
    {
        cin>>s[i].id>>str1>>str2;
        s[i].flag=0;
        s[i].time=((str1[0]-'0')*10+str1[1]-'0')*3600+((str1[3]-'0')*10+str1[4]-'0')*60+((str1[6]-'0')*10+str1[7]-'0');
        s[i].state=str2.compare("in")==0?1:0;
    }

    for(int i=1; i<=m; i++)
    {
        cin>>str1;
        query[i]=((str1[0]-'0')*10+str1[1]-'0')*3600+((str1[3]-'0')*10+str1[4]-'0')*60+((str1[6]-'0')*10+str1[7]-'0');
    }

    sort(s+1,s+1+n,cmp);

    int num=1,Que=1,ss=0,d;
    int ans=0;
    for(int i=1; i<=n; i++)         //标记错误的语句
    {
        str1=s[i].id;
        if(q[str1]==0)                            //当前车牌没出现过
        {
            ID[num]= {s[i].id,s[i].state,0,s[i].time,i};
            q[str1]=num++;
        }
        else
        {
            d=q[str1];
            if(ID[d].state==1&&s[i].state==1)      //多个in取最后一个 前面的in语句不合法
            {
                s[ID[d].loc].flag=1;
                ID[d].loc=i;
            }
            else if(ID[d].state==1&&s[i].state==0) //出去
                ID[d].state=0;
            else if(ID[d].state==0&&s[i].state==1)   //再次进入
            {
                ID[d].state=1;
                ID[d].loc=i;
            }
            else if(ID[d].state==0&&s[i].state==0)  //多个out取最前一个
                s[i].flag=1;
        }
    }
    for(int i=1;i<num;i++)
    {
        if(ID[i].state==1)         //进去没出来 不合法
        {
            s[ID[i].loc].flag=1;
            ID[i].state=0;
        }
    }
    for(int i=1; i<=n; i++)         //遍历所有语句
    {
        if(s[i].flag)
            continue;
        while(Que<m+1&&query[Que]<s[i].time)  //  while 切记
        {
            Que++;
            printf("%d\n",ss);
        }
        str1=s[i].id;
        d=q[str1];
        if(ID[d].state==1&&s[i].state==0) //进入 出去
        {
            ss--;
            ID[d].state=0;
            ID[d].sum+=s[i].time-ID[d].in_time;
            if(ID[d].sum>ans){
                ans=ID[d].sum;
                w.clear();
                w.insert(ID[d].id);
            }
            else if(ID[d].sum==ans)
                w.insert(ID[d].id);

        }
        else if(ID[d].state==0&&s[i].state==1)   //再次进入
        {
            ss++;
            ID[d].state=1;
            ID[d].in_time=s[i].time;
        }

    }
    while(Que<m+1)
    {
        printf("%d\n",ss);
        Que++;
    }
    set<string>::iterator ii;
    for(ii=w.begin();ii!=w.end();ii++)
        cout<<*ii<<" ";
    printf("%02d:%02d:%02d\n",ans/3600,ans%3600/60,ans%60);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 21:52:30

PAT 1095 Cars on Campus 模拟的相关文章

PAT 1095. Cars on Campus (30)

1095. Cars on Campus (30) Zhejiang University has 6 campuses and a lot of gates. From each gate we can collect the in/out times and the plate numbers of the cars crossing the gate. Now with all the information available, you are supposed to tell, at

1095. Cars on Campus (30)——PAT (Advanced Level) Practise

题目信息 1095. Cars on Campus (30) 时间限制220 ms 内存限制65536 kB 代码长度限制16000 B Zhejiang University has 6 campuses and a lot of gates. From each gate we can collect the in/out times and the plate numbers of the cars crossing the gate. Now with all the informati

PAT A1095 Cars on Campus

PAT A1095 Cars on Campus 题目描述: Zhejiang University has 8 campuses and a lot of gates. From each gate we can collect the in/out times and the plate numbers of the cars crossing the gate. Now with all the information available, you are supposed to tell

PAT甲题题解-1095. Cars on Campus(30)-(map+树状数组,或者模拟)

题意:给出n个车辆进出校园的记录,以及k个时间点,让你回答每个时间点校园内的车辆数,最后输出在校园内停留的总时间最长的车牌号和停留时间,如果不止一个,车牌号按字典序输出. 几个注意点: 1.如果一个车连续多次进入,只取最后一个 2.如果一个车连续多次出去,只取第一个 3.一个车可能出入校园内好几次,停留时间取总和 实际上题目就是让我们求某个时间段内的车辆总和,时间段其实就相当于一个区间,区间求和的话,很快就联想到树状数组和线段树.然而怎么将时间段和区间联系起来呢,那就存储出现在记录和询问里的所有

PAT (Advanced Level) 1095. Cars on Campus (30)

模拟题.仔细一些即可. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<map> #include<queue> #include<cstring> #include<stack> #include<vector> #include<iostream> using namesp

1095. Cars on Campus (30)

Zhejiang University has 6 campuses and a lot of gates. From each gate we can collect the in/out times and the plate numbers of the cars crossing the gate. Now with all the information available, you are supposed to tell, at any specific time point, t

1095 Cars on Campus(30 分

Zhejiang University has 8 campuses and a lot of gates. From each gate we can collect the in/out times and the plate numbers of the cars crossing the gate. Now with all the information available, you are supposed to tell, at any specific time point, t

1095 Cars on Campus

题意:给出N量车的车牌号,进出的时间,进/出状态.然后给出若干个查询,要求计算在每一查询时刻校园内停着的汽车数量,最后输出这一天中停放时间最长的车辆(若车不止一辆,则按字典序输出)以及停放时间.注:查询时间是按时间增序给出的. 思路:[这道题还不错] 1.首先,根据车牌号以及时间顺序将输入记录进行排序(cmp1),筛选出一进一出配对的合法记录.筛选的过程中同时记录一辆车的停车时长.车牌号以及停车时长可以用map建立映射关系. 2.然后,统计一天内(从00:00:00~23:59:59)每个时刻校

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long