强化阶段 Day 9 算法笔记 4.1 排序(3)

目录

1.Cars on Campus


1.Cars on Campus

这一题也是比较复杂的逻辑题了。

下次还得再做一遍

#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;

const int maxn=10010;
struct car{
	char id[8];
	int time;
	char status[4];
}all[maxn],valid[maxn];

int num=0;
map<string,int> parktime;

int timetoint(int hh,int mm,int ss){
	return hh*3600+mm*60+ss;
}

bool cmpbyidandtime(car a,car b){
	if(strcmp(a.id,b.id)) return strcmp(a.id,b.id)<0;
	else return a.time<b.time;
}

bool cmpbytime(car a,car b){
	return a.time<b.time;
}

int main(){
	int n,k;
	scanf("%d %d",&n,&k);
	int hh,mm,ss;
	for(int i=0;i<n;i++){
		scanf("%s %d:%d:%d %s",&all[i].id,&hh,&mm,&ss,&all[i].status);
		all[i].time=timetoint(hh,mm,ss);
	}
	//先根据id再根据时间排名 
	sort(all,all+n,cmpbyidandtime);
	int maxtime=-1;
	for(int i=0;i<n-1;i++){
		//如果连着的两条记录是同一个人,并且前面是in后面是out,那么就加入到valid数组中去 
		if(!strcmp(all[i].id,all[i+1].id)&&
		!strcmp(all[i].status,"in")&&
		!strcmp(all[i+1].status,"out")){
			valid[num++] = all[i];
			valid[num++] = all[i+1];
			int intime=all[i+1].time-all[i].time;
			//如果这个人还没有进入过,但现在进来了,那就初始化一个0 
			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(valid,valid+num,cmpbytime);
	//now是不超过查询时间的记录 
	int now=0,numcar=0;
	for(int i=0;i<k;i++){
		scanf("%d:%d:%d",&hh,&mm,&ss);
		int time=timetoint(hh,mm,ss);
		while(now<num&&valid[now].time<=time){
			if(!strcmp(valid[now].status,"in")) numcar++;
			else numcar--;
			now++;
		}
		printf("%d\n",numcar);
	}
	
	map<string,int>::iterator it;
	for(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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值