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

PAT 1095 Cars on Campus 模拟

时间:2015-07-17 18:47:30      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:c++

题目链接:

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;
}



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

PAT 1095 Cars on Campus 模拟

标签:c++

原文地址:http://blog.csdn.net/axuan_k/article/details/46930705

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