1095 Cars on Campus (30分)/排序/数学建模

题目描述

Zhejiang University has 8 campuses and a lot of gates. From each gate we can collect the in/out times and the plate numbers of the cars crossing the gate. Now with all the information available, you are supposed to tell, at any specific time point, the number of cars parking on campus, and at the end of the day find the cars that have parked for the longest time period.

Input Specification:

Each input file contains one test case. Each case starts with two positive integers N (<=10​4), the number of records, and K (≤8×10​​4) the number of queries. Then N lines follow, each gives a record in the format:

plate_number hh:mm:ss status

Note that all times will be within a single day. Each in record is paired with the chronologically next record for the same car provided it is an out record. Any in records that are not paired with an out record are ignored, as are out records not paired with an in record. It is guaranteed that at least one car is well paired in the input, and no car is both in and out at the same moment. Times are recorded using a 24-hour clock.

Then KKK lines of queries follow, each gives a time point in the format hh:mm:ss. Note: the queries are given in ascending order of the times.

Output Specification:

For each query, output in a line the total number of cars parking on campus. The last line of output is supposed to give the plate number of the car that has parked for the longest time period, and the corresponding time length. If such a car is not unique, then output all of their plate numbers in a line in alphabetical order, separated by a space.

Sample Input:

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

Sample Output:

1

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


待解决的问题

(1)一辆车进入或驶出的时间可能没有匹配记录,需要将不匹配的记录剔除。
为了方便判断记录是否匹配,先将同一的辆车的记录归并到一起且按时间先后排序。
(2)判断记录是驶入还是驶出
在struct设置flag变量,不同的值表示不同的状态
(3)如何获取某一时间的校内车辆数
剔除无效记录之后,再将所有有效数据按时间先后排序。计算所有记录对应的时间点的校内车辆(可以用在线处理,也可以用动态规划dp),读入要计算的时间点之后,只需要在记录中找到最后一个早于此时间点的记录,这个记录对应时间点的车辆数即为所求。


AC代码

#include<iostream>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
struct node {
	char id[8];
	int time, flag;
}no[10005];
vector<node> valid;
bool cmp1(node a, node b) {
	if (strcmp(a.id, b.id) != 0) return strcmp(a.id, b.id) < 0;
	else return a.time < b.time;
}
bool cmp2(node a, node b) {
	return a.time < b.time;
}
map<string, int> mapp;
int main() {
#ifdef ONLINE_JUDGE
#else
	freopen("1.txt", "r", stdin);
#endif
	int n, k; cin >> n >> k;
	for(int i=0;i<n;i++) {
		char temp[4];
		int h, m, s;
		scanf("%s %d:%d:%d %s", no[i].id, &h, &m, &s, temp);
		no[i].time = h * 3600 + m * 60 + s;
		if (temp[0] == 'i') no[i].flag = 1;
		else no[i].flag = -1;
	}
	sort(no, no + n, cmp1);
	int maxt = -1;
	for (int i = 0; i < n-1; i++) {
		if (strcmp(no[i].id, no[i + 1].id) == 0 && no[i].flag == 1 && no[i + 1].flag == -1) {
			valid.push_back(no[i]); valid.push_back(no[i + 1]);
			mapp[no[i].id] += no[i + 1].time - no[i].time;  //该车辆的parking time++
			if (mapp[no[i].id] > maxt) maxt = mapp[no[i].id]; //更新最大parking time
		}
	}
	sort(valid.begin(), valid.end(),cmp2); //按时排序
	int i = 0, cnt=0;
	while (k--) {
		int h, m, s;
		scanf("%d:%d:%d", &h, &m, &s);
		int time= h * 3600 + m * 60 + s;
		for (; i < valid.size(); i++) {
			if (valid[i].time <= time) {  //在线处理
				if (valid[i].flag == 1) cnt++; //有车进来数量就自增
				else cnt--; //有车出去就自减
			}
			else break;
		}
		printf("%d\n", cnt);
	}
	for (auto it : mapp) {
		if (it.second == maxt) cout << it.first << " ";
	}
	printf("%02d:%02d:%02d", maxt / 3600, maxt % 3600 / 60, maxt % 3600 % 60);	
	return 0;
}
发布了62 篇原创文章 · 获赞 7 · 访问量 3120

猜你喜欢

转载自blog.csdn.net/weixin_43590232/article/details/104168643