PAT 甲级 1095 Cars on Campus

停车场记录了车辆进出的时间,求某个时间点停车场内车辆的数量和停车时间最长的车辆id及时间。具体题目可见PAT 1095 Cars on Campus。做这道题的时候可把我恶心坏了,只给了300ms很容易超时,主要是用到了map映射,以及排序相关的知识,用一个结构体保存一辆车的各种信息,包括进出时间、id、停车总时间等。做这道题最好把所有时间化成秒来做,会容易一些,询问车辆数量的时间点是递增的,这个也要注意,最后就是停车时间最长的车辆可以有多个,输出根据车辆id排序。总的来说是一道大模拟题。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
#include <cmath>
using namespace std;
struct node
{
    string id;
    int cost,t;
    vector<int> time,inout;
    bool operator < (const node& rhs) const
    {
        return cost>rhs.cost||(cost==rhs.cost&&id<rhs.id);
    }
}car[10005];

map<string,int> mp;

bool cmp(int a,int b)
{
	return abs(a)<abs(b);
}

int main()
{
    int n,K;
    cin>>n>>K;
    string ss,op;
    int h,m,s;
    int cnt=1;
    for(int i=0;i<n;i++)
    {
        cin>>ss;
        scanf("%d:%d:%d",&h,&m,&s);
        cin>>op;
        if(!mp[ss]) 
		{
			mp[ss]=cnt++;
			car[mp[ss]].id=ss;
		}
		if(op=="in")
		car[mp[ss]].time.push_back(-(h*60*60+m*60+s));
		else
		car[mp[ss]].time.push_back(h*60*60+m*60+s);
        
    }
    for(int i=1;i<cnt;i++)
    {
		car[i].cost=0;
		car[i].t=1;
		sort(car[i].time.begin(),car[i].time.end(),cmp);
		for(int j=1;j<car[i].time.size();j++)
		if(car[i].time[j]>0&&car[i].time[j-1]<=0)
		{
			car[i].cost+=car[i].time[j]+car[i].time[j-1];
			car[i].inout.push_back(-car[i].time[j-1]);
			car[i].inout.push_back(car[i].time[j]);
		}
    }
    sort(car+1,car+cnt);
    int times;
    for(int i=0;i<K;i++)
    {
        scanf("%d:%d:%d",&h,&m,&s);
        times=h*60*60+m*60+s;
        int ans=0;
        for(int j=1;j<cnt;j++)
        {
        	while(car[j].t<car[j].inout.size()&&times>car[j].inout[car[j].t])
        	{
        		car[j].t+=2;
        	}
        	if(car[j].t<car[j].inout.size()&&times>=car[j].inout[car[j].t-1]&&times<car[j].inout[car[j].t])
        	{
        		ans++;
        	}
        }
        printf("%d\n",ans);
    }
    
    for(int i=1;i<cnt;i++)
    if(car[i].cost==car[1].cost)
    cout<<car[i].id<<' ';
    else break;
    printf("%02d:%02d:%02d",car[1].cost/3600,(car[1].cost%3600)/60,car[1].cost%60);
    return 0;
}
posted @ 2020-06-06 17:39  South1999  阅读(95)  评论(0编辑  收藏  举报