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 (≤), the number of records, and K (≤) 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 accendingorder 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
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
const int maxn = 100010;
struct Car{
    char id[10];
    int time;
    char status[5];
}all[maxn],valid[maxn];
map<string,int>parkTime;

int timeToint(int hh,int mm,int ss){
    return hh*3600+mm*60+ss;
}

bool cmpTimeAndId(Car a,Car b){
    int s = strcmp(a.id,b.id);
    if(s != 0) return s < 0;
    else return a.time < b.time;
}

bool cmpTime(Car a,Car b){
    return a.time < b.time;
}

int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    int hh,mm,ss;
    for(int i = 0; i < n; i++){
        scanf("%s %d:%d:%d %s",all[i].id,&hh,&mm,&ss,all[i].status);
        all[i].time = timeToint(hh,mm,ss);
    }
    sort(all,all+n,cmpTimeAndId);
    int num = 0,maxTime = -1;
    for(int i = 0; i < n - 1; i++){
        if(!strcmp(all[i].id,all[i+1].id) && !strcmp(all[i].status,"in") && !strcmp(all[i+1].status,"out")){
            valid[num++] = all[i];
            valid[num++] = all[i+1];
            int inTime = all[i+1].time - all[i].time;
            if(parkTime.find(all[i].id) == parkTime.end()){  //parkTime.count(all[i].id) == 0
                parkTime[all[i].id] = 0;
            }
            parkTime[all[i].id] += inTime;
            maxTime = max(maxTime,parkTime[all[i].id]);
        }
    }
    sort(valid,valid+num,cmpTime);
    int now = 0,numCar = 0; //now 必须放在外面不然会重复循环导致超时
    for(int i = 0; i < k; i++){
        scanf("%d:%d:%d",&hh,&mm,&ss);
        int qTime = timeToint(hh,mm,ss);
        while(now < num && valid[now].time <= qTime){
            if(strcmp(valid[now].status,"in") == 0) numCar++;
            else numCar--;
            now++;
        }
        printf("%d\n",numCar);
    }
    map<string,int>::iterator it;
    for(it = parkTime.begin(); it != parkTime.end(); it++){
        if(it -> second == maxTime){
            printf("%s ",it->first.c_str());  //用printf输出map中string的方式
        }
    }
    printf("%02d:%02d:%02d",maxTime/3600,maxTime%3600/60,maxTime%60); //时间中的分组是先取模,再除
    return 0;
}

原文地址:https://www.cnblogs.com/wanghao-boke/p/9570795.html

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

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

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 (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.一个车可能出入校园内好几次,停留时间取总和 实际上题目就是让我们求某个时间段内的车辆总和,时间段其实就相当于一个区间,区间求和的话,很快就联想到树状数组和线段树.然而怎么将时间段和区间联系起来呢,那就存储出现在记录和询问里的所有

PAT 1095 Cars on Campus 模拟

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

1095 Cars on Campus

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

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

pta08-图7 公路村村通 (30分)

08-图7 公路村村通   (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N):随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本.为简单起见,城镇从1到N编号. 输出格式: 输出村村通需要的最低成本.如果输入数据不足以保证畅通,则输出−1,表示需要建设更多公路. 输入样例: 6