PAT A1095 Cars on Campus

PAT A1095 Cars on Campus

题目描述:

  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
  where plate_number is a string of 7 English capital letters or 1-digit numbers; hh:mm:ss represents the time point in a day by hour:minute:second, with the earliest time being 00:00:00 and the latest 23:59:59; and status is either in or out.
  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 K 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 PAT A1095 Cars on Campus
 3 ****************************************************/
 4 #include <iostream>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <map>
 8
 9 using namespace std;
10
11 struct ParkRecord {
12     string num;
13     int time;
14     string state;
15 };
16
17 bool cmpByNumAndState(ParkRecord a, ParkRecord b) {
18     return (a.num == b.num ? a.time < b.time : a.num < b.num);
19 }
20
21 bool ccmpByTime(ParkRecord a, ParkRecord b) {
22     return a.time < b.time;
23 }
24
25 int main() {
26     int recordCnt = 0, askTime = 0, maxParkTime = -1;
27
28     cin >> recordCnt >> askTime;
29
30     map<string, int> ParkTime;
31     vector<ParkRecord> EffectRecord;
32     vector<ParkRecord> OriginRecord(recordCnt);
33
34     //读入原始的记录
35     int hour = 0, min = 0, sec = 0, time = 0;
36     for (int i = 0; i < recordCnt; ++i) {
37         cin >> OriginRecord[i].num;
38         scanf("%d:%d:%d", &hour, &min, &sec);
39         cin >> OriginRecord[i].state;
40
41         time = hour * 3600 + min * 60 + sec;
42         OriginRecord[i].time = time;
43     }
44
45     //对原始记录进行排序
46     sort(OriginRecord.begin(), OriginRecord.end(), cmpByNumAndState);
47
48     //将有效的记录存入新的容器中
49     for (int i = 0; i < OriginRecord.size() - 1; ++i) {
50         if (OriginRecord[i].num == OriginRecord[i + 1].num &&
51             OriginRecord[i].state == "in" && OriginRecord[i + 1].state == "out") {
52             EffectRecord.push_back(OriginRecord[i]);
53             EffectRecord.push_back(OriginRecord[i + 1]);
54
55             if (ParkTime[OriginRecord[i].num] == 0) {
56                 ParkTime[OriginRecord[i].num] = 0;
57             }
58
59             ParkTime[OriginRecord[i].num] += OriginRecord[i + 1].time - OriginRecord[i].time;
60
61             if (maxParkTime < ParkTime[OriginRecord[i].num]) {
62                 maxParkTime = ParkTime[OriginRecord[i].num];
63             }
64         }
65     }
66
67     //对有效记录进行排序
68     sort(EffectRecord.begin(), EffectRecord.end(), ccmpByTime);
69
70     //输出查询时间点的车辆数目
71     int now = 0, carCnt = 0;
72     for (int i = 0; i < askTime; ++i) {
73         scanf("%d:%d:%d", &hour, &min, &sec);
74
75         time = hour * 3600 + min * 60 + sec;
76
77         for (; now < EffectRecord.size() && EffectRecord[now].time <= time; ++now) {
78             EffectRecord[now].state == "in" ? carCnt++: carCnt--;
79         }
80
81         cout << carCnt << endl;
82     }
83
84     //输出停车时间最长的车辆牌号和最长时间
85     for (map<string, int>::iterator itr = ParkTime.begin(); itr != ParkTime.end(); ++itr) {
86         if (itr->second == maxParkTime) {
87             cout << itr->first << ‘ ‘;
88         }
89     }
90
91     printf("%02d:%02d:%02d", maxParkTime / 3600, (maxParkTime % 3600) / 60, maxParkTime % 60);
92
93     return 0;
94 }

注意事项:

  1:在Visual Studio 2019中不能使用scanf(会被认为不安去,无法通过编译),但是在最终判定的时候会因为scanf_f产生编译错误,因此提交的时候记得改成scanf。

原文地址:https://www.cnblogs.com/mrdragon/p/11651459.html

时间: 2024-10-07 00:48:22

PAT A1095 Cars on Campus的相关文章

PAT 1095. Cars on Campus (30)

1095. Cars on Campus (30) Zhejiang University has 6 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

PAT 1095 Cars on Campus 模拟

题目链接: PAT1095 题意 : 有一个学校,每天会有很多车进出:给出N条车辆进出情况和M条询问 每条询问输出当前校园有多少辆车,时间从0点24点  最后输出停留最久的车的车牌号和停留时间,  如果有多个,则按字典序输出车牌号 注意  必须要使得所有数据保证以下情况,否则为无效数据: 1 最开始校园里是没车的 2 最后不能有车停留 3 同一辆车连续多次进入 只有最后一个是正确的 4 同一辆车连续多次出去 只有最开始一个是正确的 题解思路: 考察基本功 用map来记录每一个车牌号的下标 首先将

1095. Cars on Campus (30)——PAT (Advanced Level) Practise

题目信息 1095. Cars on Campus (30) 时间限制220 ms 内存限制65536 kB 代码长度限制16000 B Zhejiang University has 6 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 informati

PAT (Advanced Level) 1095. Cars on Campus (30)

模拟题.仔细一些即可. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<map> #include<queue> #include<cstring> #include<stack> #include<vector> #include<iostream> using namesp

PAT甲题题解-1095. Cars on Campus(30)-(map+树状数组,或者模拟)

题意:给出n个车辆进出校园的记录,以及k个时间点,让你回答每个时间点校园内的车辆数,最后输出在校园内停留的总时间最长的车牌号和停留时间,如果不止一个,车牌号按字典序输出. 几个注意点: 1.如果一个车连续多次进入,只取最后一个 2.如果一个车连续多次出去,只取第一个 3.一个车可能出入校园内好几次,停留时间取总和 实际上题目就是让我们求某个时间段内的车辆总和,时间段其实就相当于一个区间,区间求和的话,很快就联想到树状数组和线段树.然而怎么将时间段和区间联系起来呢,那就存储出现在记录和询问里的所有

1095. Cars on Campus (30)

Zhejiang University has 6 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, t

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, t

1095 Cars on Campus

题意:给出N量车的车牌号,进出的时间,进/出状态.然后给出若干个查询,要求计算在每一查询时刻校园内停着的汽车数量,最后输出这一天中停放时间最长的车辆(若车不止一辆,则按字典序输出)以及停放时间.注:查询时间是按时间增序给出的. 思路:[这道题还不错] 1.首先,根据车牌号以及时间顺序将输入记录进行排序(cmp1),筛选出一进一出配对的合法记录.筛选的过程中同时记录一辆车的停车时长.车牌号以及停车时长可以用map建立映射关系. 2.然后,统计一天内(从00:00:00~23:59:59)每个时刻校

PAT甲级题分类汇编——线性

线性类,指线性时间复杂度可以完成的题.在1051到1100中,有7道: 题号 标题 分数 大意 时间 1054 The Dominant Color 20 寻找出现最多的数 200ms 1061 Dating 20 寻找字符串中相同字符 200ms 1071 Speech Patterns 25 寻找出现最多的单词 300ms 1077 Kuchiguse 20 字符串共同后缀 150ms 1082 Read Number in Chinese 25 中文读数 400ms 1084 Broken