PAT甲级 1095 Cars on Campus 模拟(30分)汽车停留

41 篇文章 1 订阅

在这里插入图片描述
在这里插入图片描述

Solution:

题目大意:
给出n个汽车的记录,分别记录车的车牌号、到达或者离开时间。再给出k个查询,每个查询给出一个时间,求出在这个时间点有多少车停在校园内。并且求出所有车中累计停留时间最长的车的车牌号以及最长时间。每个in都要与后一个时间连续的out匹配,不能匹配的不计算在内(比如连续两个in,第一个就不算,或者连续两个out,第二个就不算)。

代码如下:

//模拟
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
#include<map>
#include<string.h>
#define early 0
#define late 23*3600+59*60+59
using namespace std;

int n,k;//n条记录,k个查询

struct car{
    string name,flag;
    int time;
};

vector<car> vec;
map<string,int> mp_time;
map<string,int> mp;

bool cmp(car a,car b){
    return a.time<b.time;
}

int main(){
    //cin>>n>>k;
    scanf("%d%d",&n,&k);
    vec.resize(n);
    int h,m,s;//小时,分钟,秒
    char name_ch[10],flag[10];
    for(int i=0;i<n;i++){
        scanf("%s",name_ch);
        vec[i].name=name_ch;
        scanf("%d:%d:%d",&h,&m,&s);
        scanf("%s",flag);
        vec[i].flag=flag;
        vec[i].time=h*3600+m*60+s;
    }

    sort(vec.begin(),vec.end(),cmp);


    for(int i=0;i<k;i++){
        int temp;
        scanf("%d:%d:%d",&h,&m,&s);
        temp=h*3600+m*60+s;
        int ans=0;
        for(int j=0;j<vec.size();j++){
            if(vec[j].flag=="in"){
                mp[vec[j].name]=vec[j].time;
            }
            if(mp[vec[j].name]!=0&&vec[j].flag=="out"&&vec[j].time>mp[vec[j].name]){
                if(vec[j].time>temp&&mp[vec[j].name]<=temp){
                    ans++;
                }
                if(i==0){
                    mp_time[vec[j].name]=mp_time[vec[j].name]+vec[j].time-mp[vec[j].name];
                }
                mp[vec[j].name]=0;
            }
        }
        printf("%d\n",ans);
    }
    int maxl=-1;
    vector<string> name;
    map<string,int>::iterator it;
    for(it=mp_time.begin();it!=mp_time.end();it++){
        if(it->second>maxl){
            maxl=it->second;
        }
    }
    for(it=mp_time.begin();it!=mp_time.end();it++){
        if(it->second==maxl){
            name.push_back(it->first);
        }
    }
    for(int j=0;j<name.size();j++){
        cout<<name[j]<<" ";
    }
    h=maxl/3600;
    m=(maxl-h*3600)/60;
    s=maxl-h*3600-m*60;
    printf("%02d:%02d:%02d",h,m,s);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值