PAT甲级-1095 Cars on Campus (30 分)

题目:1095 Cars on Campus (30 分)
分析:要求输出某个时刻停车场的人数,若in和out不匹配则本条记录无效,如in之后还是in则该辆车是无效的。本题防止超时的关键就是给的query是递增的,就不用每次都从0开始遍历。
#include <iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<stack>
#include<algorithm>
#include<map>
#include<set>
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
#define MAX 999999999
typedef long long ll;
int n,m,k;
struct Node{
    
    
    string plate;
    int time;
    string status;
    int flag;
    int yes;
}node[100001];
map<string,int>ma;
int cmp(Node x, Node y)
{
    
    
    if(x.plate == y.plate)
        return x.time < y.time;
    return x.plate < y.plate;
}
int cmp1(Node x, Node y)
{
    
    
    return x.time < y.time;
}
int main()
{
    
    
    cin>>n>>k;
    for(int i = 0; i <n; i++)
    {
    
    
        string x,y;
        int a,b,c;
        cin>>x;
        scanf("%d:%d:%d",&a,&b,&c);
        cin>>y;
        node[i].plate = x;
        node[i].status = y;
        node[i].time = a * 3600 + b * 60 + c;
        node[i].flag = y[0]=='i'?0:1;
    }
    sort(node,node+n,cmp);
    int mmax = -1;
    for(int i = 0 ; i < n - 1 ;i ++)
    {
    
    
        if(node[i].plate == node[i+1].plate && node[i].flag == 0 && node[i+1].flag == 1){
    
    
            ma[node[i].plate] += node[i+1].time - node[i].time;
            mmax = max(mmax, ma[node[i].plate]);
            node[i].yes = node[i+1].yes = 1;
        }
    }
    sort(node,node+n,cmp1);
    int j = 0,cnt = 0;
    for(int i = 0 ; i < k ; i++)
    {
    
    
        int a,b,c;
        scanf("%d:%d:%d",&a,&b,&c);
        int t = a * 3600 + b * 60 + c;
        for(; j < n && node[j].time <= t;j ++)
        {
    
    
            if(node[j].yes == 1 && node[j].status == "in"){
    
    
                cnt++;
            }
            if(node[j].yes == 1 && node[j].status == "out"){
    
    
                cnt--;
            }
        }
        cout<<cnt<<endl;

    }
    for(auto it = ma.begin();it!=ma.end();it++)
    {
    
    
        if(it->second == mmax)
            cout<<it->first<<" ";
    }
    printf("%02d:%02d:%02d",mmax/3600,mmax%3600/60,mmax%60);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43567222/article/details/113818845