A1095 Cars on Campus (30 分)

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cctype>
using namespace std;
struct Car{
	char no[10];
	int time, stat;
}car[40010];
struct Rec{
	int index, last;
}rec[40010];
int N, K;
int spark[90000];
bool cmp1(Car c1, Car c2){
	if(strcmp(c1.no, c2.no) != 0) return strcmp(c1.no, c2.no) < 0;
	if(c1.time != c2.time) return c1.time < c2.time;
	return c1.stat > c2.stat;
}
bool cmp2(Rec r1, Rec r2){	
	if(r1.last != r2.last ) return r1.last > r2.last;
	else return strcmp(car[r1.index].no, car[r2.index].no) < 0;
}
int main(){	
	memset(spark, 0, sizeof(spark));	
	int hh, mm, ss;
	char temp[5];
	scanf("%d %d", &N, &K);
	for(int i = 0; i < N; i++){
		scanf("%s %d:%d:%d %s", car[i].no, &hh, &mm, &ss, temp);
		car[i].time = hh*3600 + mm*60 + ss;
		if(strcmp(temp, "in") == 0) car[i].stat = 1;
		else car[i].stat = -1;
	}
	sort(car, car+N, cmp1);
	int p = 1, num = 0;
	rec[0].index = 0;
	rec[0].last = 0;
	while(p < N){		
		if(strcmp(car[p-1].no, car[p].no) == 0){
			if(car[p-1].stat == 1 && car[p].stat == -1){
				for(int j = car[p-1].time; j < car[p].time; j++){
					spark[j]++;
				}	
				rec[num].last += car[p].time - car[p-1].time;
			}
			p++;	
		}else{
			rec[++num].index = p++;
			rec[num].last = 0;	
		}	
	}
	sort(rec, rec+num+1, cmp2);
	for(int i = 0; i < K; i++){
		scanf("%d:%d:%d", &hh, &mm, &ss);
		int time = hh*3600 + mm*60 + ss;
		printf("%d\n", spark[time]);
	}
	
	int index = rec[0].index, last = rec[0].last;
	printf("%s", car[index].no);
	for(int i = 1; i <= num; i++){
		index = rec[i].index;
		if(rec[i].last == last) printf(" %s", car[index].no);
		else break;
	}
	hh = last/3600; mm = (last%3600)/60;
	ss = (last%3600)%60;
	printf(" %02d:%02d:%02d", hh, mm, ss);
	return 0;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值