1095. Cars on Campus (30)

1095. Cars on Campus (30)
注意题目所给的信息,k个queries是按时间降序给出的,所以我们遍历时只要对所有记录按照时间排序,再进行遍历即可;否则容易超时
注意in和out的配对,本代码用islegal来核对该条记录是否正确;
对于最大值对应车牌号的储存,用string来记录所有满足条件的车牌号比较方便;
注意最后时间格式的输出;

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
    char plate[12];
    int time;
    int status;
    bool islegal;
}v[10008];
bool sortbyplate(const node &a,const node &b)
{
    if(strcmp(a.plate,b.plate)==0)
        return a.time<b.time;
    return strcmp(a.plate,b.plate)<0;
}
bool sortbytime(const node &a,const node &b)
{
    if(a.islegal==b.islegal)
        return a.time<b.time;
    return a.islegal>b.islegal;
}
void CheckIslegal(struct node v[],int n)
{
    for(int i=0;i<n;++i)
    {
        if(i==n-1){
            v[i].islegal=false;break;
        }
        if(strcmp(v[i].plate,v[i+1].plate)==0)
        {
            if(v[i].status&&!v[i+1].status){
                v[i].islegal=true;
                v[i+1].islegal=true;i++;
            }
            else v[i].islegal=false;
        }
        else v[i].islegal=false;
    }
}
int CalMaxtime(struct node v[],int n,string &ans)
{
    int max=-1;
    for(int i=0;i<n;i++)
    {
        if(v[i].islegal&&v[i].status)
        {
            int ct=0,j=i;
            while(j<n&&strcmp(v[i].plate,v[j].plate)==0)
            {
                if(v[j].islegal&&v[j].status){
                    ct+=v[j+1].time-v[j].time;
                    ++j;
                }
                ++j;
            }
            if(max<ct)
            {
                ans.clear();
                ans=v[i].plate;
                max=ct;
            }
            else if(max==ct)
            {
                ans+=" ";
                ans+=v[i].plate;
            }
            i=j-1;
        }
    }
    return max;
}
void ReadQuery(struct node v[],int n,int k)
{
    int hh,mm,ss,cur,i=0,cnt=0;
    while(k--)
    {
        scanf("%d:%d:%d",&hh,&mm,&ss);
        cur=hh*3600+mm*60+ss;
        while(i<n&&v[i].time<=cur&&v[i].islegal)
        {
            if(v[i].status) ++cnt;
            else --cnt;
            ++i;
        }
        printf("%d\n",cnt);
    }
}
int main()
{
    int n,k;
    int hh,mm,ss;
    char s[8];
    scanf("%d %d",&n,&k);
    for(int i=0;i<n;++i)
    {
        scanf("%s %d:%d:%d %s",v[i].plate,&hh,&mm,&ss,s);
        v[i].time=hh*3600+mm*60+ss;
        v[i].status=(s[0]=='i')?1:0;
    }
    sort(v,v+n,sortbyplate);
    CheckIslegal(v,n);
    string ans="";
    int max=CalMaxtime(v,n,ans);
    sort(v,v+n,sortbytime);
    ReadQuery(v,n,k);
    printf("%s %02d:%02d:%02d",ans.c_str(),max/3600,max%3600/60,max%60);
    return 0;
}

转载于:https://www.cnblogs.com/xLester/p/7570350.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值