【PAT - 甲级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 statuswhere?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:00Sample Output:
1 4 5 2 1 0 1 JH007BD ZD00001 07:20:09題目大意:
給出n個車牌號、時間點、進出狀態(tài)的記錄,然后查詢k個時間點這時校園內的車輛個數(shù)。最后還要輸出在校園里面呆的時間最長的車的車牌號,以及呆了多久的時間。如果有多輛車就按照它的字母從小到大輸出車牌。
配對要求是,如果一個車多次進入未出,取最后一個值;如果一個車多次out未進入,取第一個值。
注意:一個車可能出入校園好多次,停車的時間應該取之和。
解題報告:
注意湊樣例的過程中,發(fā)現(xiàn)是要先對記錄表單進行排錯,然后再進行統(tǒng)計。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define FF first #define SS second #define ll long long #define pb push_back #define pm make_pair using namespace std; typedef pair<int,int> PII; const int MAX = 2e5 + 5; char s[105],op[105]; int n,q; struct Node {string name;int op;int Time; } R[MAX]; bool cmp(Node a,Node b) {if(a.Time != b.Time) return a.Time < b.Time;else return a.op < b.op; } map<string,int> state;//記錄每輛車的狀態(tài) map<string,int> Time;//每輛車的停車時間 map<string,int> has; vector<string> ans; int anst; bool ok[MAX]; int main() {memset(ok,1,sizeof ok);cin>>n>>q;for(int hh,mm,ss,i = 1; i<=n; i++) {scanf("%s",s);scanf("%d:%d:%d",&hh,&mm,&ss);scanf("%s",op);R[i].name = s;R[i].op = (op[0] == 'i' ? 1 : 2);R[i].Time = hh*3600+mm*60+ss;}for(int hh,mm,ss,i = 1; i<=q; i++) {scanf("%d:%d:%d",&hh,&mm,&ss);R[n+i].op = 3;R[n+i].Time = hh*3600+mm*60+ss;}sort(R+1,R+n+q+1,cmp);has.clear();for(int i = 1; i<=n+q; i++) {if(R[i].op == 1) {has[R[i].name] = 1;}else if(R[i].op == 2){if(has[R[i].name] == 0) ok[i] = 0; has[R[i].name] = 0;}}for(int i = 1; i<=n+q; i++) has[R[i].name] = -1;for(int i = n+q; i>=1; i--) {if(ok[i] == 0) continue;if(R[i].op == 2) {has[R[i].name] = 0;}else if(R[i].op == 1) {if(has[R[i].name] != 0) ok[i] = 0; has[R[i].name] = 1;}}has.clear();int cur = 0;for(int i = 1; i<=n+q; i++) {if(ok[i] == 0) continue;if(R[i].op == 3) printf("%d\n",cur);else if(R[i].op == 1) {state[R[i].name] = R[i].Time;has[R[i].name] = 1;cur++;} else {has[R[i].name] = 0;cur--;Time[R[i].name] += R[i].Time - state[R[i].name];}}for(auto tar : Time) {if(tar.second > anst) {anst = tar.second; ans.clear(); ans.pb(tar.first);}else if(tar.second == anst) {ans.pb(tar.first);}}sort(ans.begin(),ans.end());for(auto tar : ans) {cout << tar << " ";}int hh,mm,ss;hh = anst / 3600; anst -= hh * 3600;mm = anst / 60; anst -= mm * 60;ss = anst;printf("%02d:%02d:%02d\n",hh,mm,ss);return 0 ; }?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的【PAT - 甲级1095】Cars on Campus (30分)(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ROG游戏手机6 Pro入网证件照公布:
- 下一篇: 三头雄狮能拿下一只河马不?