停车场记录了车辆进出的时间,求某个时间点停车场内车辆的数量和停车时间最长的车辆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()&×>car[j].inout[car[j].t])
{
car[j].t+=2;
}
if(car[j].t<car[j].inout.size()&×>=car[j].inout[car[j].t-1]&×<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;
}