PAT.A1095 Cars on Campus

返回目录

在这里插入图片描述

题意

给出N条记录,每条记录给出一辆车的车牌号、 当前时刻以及出入校情况(入校(in)还是出校(ou))。然后给出K个查询,每个查询给出个时刻, 输出在这个时刻校园内的车辆数。查询完毕后输出在学校内停留时间最长的车辆的车牌号(如果有多个,就一并输出)和对应的停留时间。注意:对同一辆车来说, 配对的on和off必须满足在把这辆车的记录按时间顺序排列后,在它们之间不允许出现其他on或者off的记录;否则,将被视为无效记录。

样例(可复制)

16 7
JH007BD 18:00:01 in
ZD00001 11:30:08 out
DB8888A 13:00:00 out
ZA3Q625 23:59:50 out
ZA133CH 10:23:00 in
ZD00001 04:09:59 in
JH007BD 05:09:59 in
ZA3Q625 11:42:01 out
JH007BD 05:10:33 in
ZA3Q625 06:30:50 in
JH007BD 12:23:42 out
ZA3Q625 23:55:00 in
JH007BD 12:24:23 out
ZA133CH 17:11:22 out
JH007BD 18:07:01 out
DB8888A 06:30:50 in
05:10:00
06:30:50
11:00:00
12:23:42
14:00:00
18:00:00
23:59:00

样例输出

1
4
5
2
1
0
1
JH007BD ZD00001 07:20:09

注意点

  1. 注意使用gettime对时间进行转换,更方便处理。
  2. k次查询的时刻是递增的,要利用好这点,否则会超时。
  3. 本题使用了STL库的map,可以学完后面的内容再回来看。在这里对其出现的内容进行说明:使用了map<string,int> parktime;进行声明,由于map和vector,string一样是动态的,故不需要声明大小。map.count(str)会返回str在map里的记录数。map<string,int>::iterator声明了一个map<string,int>类型的迭代器,用于遍历map。it->first可以得到map的第一个string类型元素,it->second可以得到第二个int类型元素。
#include<bits/stdc++.h>
using namespace std;

const int maxn=10010;
struct car{
	char id[8];
	int time,sta;
}all[maxn],vaild[maxn];
int num=0,maxtime=-1;//有效记录数,最久停留时间 
map<string,int> parktime;//id<-->time
int gettime(int h,int m,int s){
	return h*3600+m*60+s;
}
bool cmp1(car a,car b){//按照id和time 
	if(strcmp(a.id,b.id))return strcmp(a.id,b.id)<0;
	else return a.time<b.time;
}
bool cmp2(car a,car b){//按照time 
	return a.time<b.time;
}
int main(){
	int n,k,h,m,s;
	char tmp[5];
	cin>>n>>k;
	for(int i=0;i<n;i++){
		scanf("%s %d:%d:%d %s",all[i].id,&h,&m,&s,tmp);
		if(!strcmp(tmp,"in"))all[i].sta=0;//in记录为0
		else all[i].sta=1;//outout记录为1
		all[i].time=gettime(h,m,s);
	}
	sort(all,all+n,cmp1);
	for(int i=0;i<n-1;i++){
		if(!strcmp(all[i].id,all[i+1].id)&&all[i+1].sta-all[i].sta==1){//如果记录有效
			vaild[num++]=all[i];
			vaild[num++]=all[i+1];
			int intime=all[i+1].time-all[i].time;
			if(parktime.count(all[i].id)==0)parktime[all[i].id]=0;
			parktime[all[i].id]+=intime;
			maxtime=max(maxtime,parktime[all[i].id]);
		}
	}
	sort(vaild,vaild+num,cmp2);
	int now=0,numcar=0;
	while(k--){//k次查询
		scanf("%d:%d:%d",&h,&m,&s);
		int time=gettime(h,m,s);
		while(now<num&&vaild[now].time<=time){
			if(vaild[now].sta==0)numcar++;
			else numcar--;
			now++;
		}
		printf("%d\n",numcar);
	}
	for(map<string,int>::iterator it=parktime.begin();it!=parktime.end();it++){
		if(it->second==maxtime)printf("%s ",it->first.c_str());
	}
	printf("%02d:%02d:%02d\n",maxtime/3600,maxtime%3600/60,maxtime%60);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小怪兽会微笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值