PAT 1095 Cars on Campus 模拟

题目链接:

PAT1095



题意 :

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

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

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

1 最开始校园里是没车的

2 最后不能有车停留

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

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



题解思路:

考察基本功


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

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

遍历一次删除不合法语句

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

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

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



代码:

#include
#include
#include
#include
#include
#include
#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];

mapq;
setw;

int cmp(node a,node b)
{
    return a.time>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;ians){
                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::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;
}



你可能感兴趣的:(算法)