1095 Cars on Campus (30 分)

本文介绍了一种算法,用于解决停车场内车辆进出计数及停留时间分析的问题。通过对比车牌信息,筛选并配对车辆的进入和离开时间,算法能够精确计算任意时刻停车场内的车辆数量,并找出最长停留时间的车辆。此方案使用了排序和映射数据结构来提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路

  • 首先得找出in和out都匹配的车辆,不然在后面找有多少辆车在里面且pair是很麻烦的
  • 先按车牌相同的筛选出来pair的停车和离开的时间
  • 将其保存在car数组里面,并将car排序
  • 通过car数组可以知道在当前车之前有多少辆车在里面,in记为1,out记为-1
  • 比较该车与条件时间,可以知道车辆数

code

#include <bits/stdc++.h>
using namespace std;
struct node{
    string id;
    int time,status;
};
bool cmp1(node a,node b){
    return a.id!=b.id?a.id<b.id:a.time<b.time;
}
bool cmp2(node a,node b){
    return a.time<b.time;
}
int main(){
    int n,m,hh,mm,ss,maxt=-1,time=0,j=0;
    string s;
    cin>>n>>m;
    vector<node>res(n),car;
    for(int i=0;i<n;i++){
        cin>>res[i].id;
        scanf("%d:%d:%d",&hh,&mm,&ss);
        res[i].time=hh*3600+mm*60+ss;
        cin>>s;
        s=="in"?res[i].status=1:res[i].status=-1;//-1表示离开一辆车
    }
    sort(res.begin(),res.end(),cmp1);
    map<string ,int> ans;
    for(int i=1;i<n;i++){
        if(res[i].id==res[i-1].id&&res[i].status==-1&&res[i-1].status==1){
            car.push_back(res[i-1]);
            car.push_back(res[i]);
            ans[res[i-1].id]+=res[i].time-res[i-1].time;
            maxt=max(ans[res[i-1].id],maxt);
        }
    }
    sort(car.begin(),car.end(),cmp2);
    vector<int> pos(n);
    for(int i=0;i<car.size();i++)
        i?pos[i]=pos[i-1]+car[i].status:pos[i]+=car[i].status;//截止到该车前有多少辆车
    while(m--){
        scanf("%d:%d:%d",&hh,&mm,&ss);
        time=hh*3600+mm*60+ss;
        while(j<car.size()){
            if(car[j].time>time){
                cout<<pos[j-1]<<endl;
                break;
            }else if(j==car.size()-1)//最后一辆车还是小于给定时间是无法输出的
                cout<<pos[j]<<endl;
            j++;
        }
    }
    for(auto it:ans) if(it.second==maxt) cout<<it.first<<' ';
    printf("%02d:%02d:%02d",maxt/3600,(maxt%3600)/60,maxt%60);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值