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 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 (<= 10000), the number of records, and K (<= 80000) 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

将record按照时间顺序进行排序,先确定每个record是否paired(用一个map来记录某一个车牌进入的record,遇到相应的out的记录,将两个都设为paired)

 然后计算每个时间点的车辆数,以及最后最大时长的车辆。

注意此题的query较多,不能用cin输入否则会超时,需要用scanf输入

  1 #include <iostream>
  2 #include <map>
  3 #include <string>
  4 #include <algorithm>
  5 #include <vector>
  6 #include <bitset>
  7 #include <sstream>
  8
  9 using namespace std;
 10
 11 struct Record
 12 {
 13     string plateNum;
 14     string time;
 15     string status;
 16 };
 17
 18 Record records[10000];
 19 bitset<10000> paired;
 20 map<string, int> in;
 21 string query[80000];
 22
 23 bool cmp(Record r1, Record r2)
 24 {
 25     return r1.time < r2.time;
 26 }
 27
 28 int Duration(string start, string end)
 29 {
 30     for (int i = 0; i < start.size(); i++)
 31         if (start[i] == ‘:‘)
 32             start[i] = end[i] = ‘ ‘;
 33
 34     int h1, h2, m1, m2, s1, s2;
 35     stringstream ss;
 36     ss << start << " " << end;
 37     ss >> h1 >> m1 >> s1 >> h2 >> m2 >> s2;
 38
 39     return (h2 * 60 * 60 + m2 * 60 + s2) - (h1 * 60 * 60 + m1 * 60 + s1);
 40 }
 41
 42 string ToStandardTime(int duration)
 43 {
 44     int h, m, s;
 45     h = duration / 3600;
 46     m = (duration - 3600 * h) / 60;
 47     s = duration - 3600 * h - m * 60;
 48
 49     return string(1, h / 10 + ‘0‘) + string(1, h % 10 + ‘0‘) + ":" +  50         string(1, m / 10 + ‘0‘) + string(1, m % 10 + ‘0‘) + ":" +  51         string(1, s / 10 + ‘0‘) + string(1, s % 10 + ‘0‘);
 52 }
 53
 54 int main()
 55 {
 56     int recordNum, queryNum;
 57     cin >> recordNum >> queryNum;
 58     for (int i = 0; i < recordNum; i++)
 59         cin >> records[i].plateNum >> records[i].time >> records[i].status;
 60     for (int i = 0; i < queryNum; i++)
 61     {
 62         char s[10];
 63         scanf("%s", s);
 64         query[i] = string(s);
 65     }
 66
 67     sort(records, records + recordNum, cmp);
 68     //sure whether a record is paired
 69     for (int i = 0; i < recordNum; i++)
 70     {
 71         if (records[i].status == "in")
 72             in[records[i].plateNum] = i;
 73         else
 74         {
 75             map<string, int>::iterator it = in.find(records[i].plateNum);
 76             if ( it != in.end())
 77             {
 78                 int indexOfin = in[records[i].plateNum];
 79                 paired.set(indexOfin);
 80                 paired.set(i);
 81                 in.erase(it);
 82             }
 83         }
 84     }
 85     in.clear();
 86
 87     int queryIndex = 0;
 88     string querytime = query[queryIndex++];
 89     map<string, int> duration;
 90     for (int i = 0; i < recordNum; i++)
 91     {
 92         while(querytime < records[i].time)
 93         {
 94             cout << in.size() << endl;
 95             if (queryIndex < queryNum)
 96                 querytime = query[queryIndex++];
 97             else
 98                 querytime = "24:00:00";
 99         }
100         if (paired[i])
101         {
102             if (records[i].status == "in")
103                 in[records[i].plateNum] = i;
104             else
105             {
106                 int indexOfIn = in[records[i].plateNum];
107                 if (duration.find(records[i].plateNum) == duration.end())
108                     duration[records[i].plateNum] = Duration(records[indexOfIn].time, records[i].time);
109                 else
110                     duration[records[i].plateNum] += Duration(records[indexOfIn].time, records[i].time);
111                 in.erase(in.find(records[i].plateNum));
112             }
113         }
114     }
115     if (querytime != "24:00:00")
116     {
117         for (int i = 0; i <= queryNum - queryIndex; i++)
118             cout << 0 << endl;
119     }
120
121     //sure the maximum period and corresponding plate numbers
122     int maxDuration = -1;
123     vector<string> plate;
124     for (map<string, int>::iterator it = duration.begin(); it != duration.end(); it++)
125     {
126         if (it->second > maxDuration)
127         {
128             maxDuration = it->second;
129             plate.clear();
130             plate.push_back(it->first);
131         }
132         else if (it->second == maxDuration)
133             plate.push_back(it->first);
134     }
135     for (vector<string>::iterator it = plate.begin(); it != plate.end(); it++)
136         cout << *it << " ";
137     cout << ToStandardTime(maxDuration);
138 }
时间: 2024-10-05 16:06:38

PAT 1095. Cars on Campus (30)的相关文章

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

PAT 1095 Cars on Campus 模拟

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

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

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 1076. Forwards on Weibo (30)

题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1076 此题考查图的遍历操作: 本来我个人觉得可以用dfs的,但是不知何故,有两个case没有过,贴出代码,望指出错误之处: #include <cstdio> #include <map> #include <vector> #include <memory.h> using namespace std; const int NUM=1001; bool