PAT 甲级 1095 Cars on Campus

Posted ambition-hhn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
",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;
}

以上是关于PAT 甲级 1095 Cars on Campus的主要内容,如果未能解决你的问题,请参考以下文章

PAT A1095 Cars on Campus

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

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

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

(PAT详细题解)PAT甲级--Cars on Campus

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