PATA1095 Cars on campus(AC代码,测试点2 4不通过原因分析)

容易出错的地方(导致测试点2.4不通过)

  1. 未考虑到一辆车在今天多次出入(map对应的值要更新,计算最长时间也要记得加上)
  2. 在两辆车的间隔中,可能会查询多次。我一开始的设计是查询完一次,直接跳到下一辆车的时间,这样就会错过了。
  3. 只in不out,或只out不in的不计算(这个应该很多人都注意到了),我分了record和valid两个数组记录
  4. 运行超时解决方案:本题强调了查询时间是递增的,利用好这个特性。

AC代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <cstring>
using namespace std;
struct RECORD
{
    char PlateNum[10];
    int flag;// 0 in,1 out
    int num=0;
    int time=0;
}record[10010],Valid[10010];


bool cmp_carnum(RECORD A,RECORD B)
{
    if(strcmp(A.PlateNum,B.PlateNum)!=0)
        return strcmp(A.PlateNum,B.PlateNum)<0;
    else
        return A.time<B.time;
}

bool cmp_time(RECORD A,RECORD B)
{
    if(A.time!=B.time)
        return A.time<B.time;
    else
        return strcmp(A.PlateNum,B.PlateNum)<0;
}
map<string, int> ParkTime;
int main()
{

    int N,K;
    scanf("%d %d",&N,&K);
    int hour,minute,second;
    char status[10];
    for(int i=0;i<N;i++)
    {
        scanf("%s %d:%d:%d %s ",record[i].PlateNum,&hour,&minute,&second,status);
        if(strcmp(status,"in")==0)
            record[i].flag=0;
        else
            record[i].flag=1;
        record[i].time=hour*3600+minute*60+second;
    }
    int valid_num=0;
    int length_time=0;
    sort(record,record+N,cmp_carnum);//帮车按pair排序
    for(int i=0;i<N-1;i++)
    {
        if(strcmp(record[i].PlateNum,record[i+1].PlateNum)==0 && record[i].flag==0 &&record[i+1].flag==1)
        {
            if(ParkTime.count(record[i].PlateNum)==0)
                ParkTime[record[i].PlateNum]=0;
            Valid[valid_num++]=record[i];
            Valid[valid_num++]=record[i+1];
            ParkTime[record[i].PlateNum]+=record[i+1].time-record[i].time;
            //length_time=(record[i+1].time-record[i].time)>length_time?(record[i+1].time-record[i].time):length_time;
        }   length_time=max(ParkTime[record[i].PlateNum],length_time);//lengthtime 是累加的
    }
    sort(Valid,Valid+valid_num,cmp_time);
    int now_car=0;//车的数量
    int time=0;//转换时间
    bool Runflag=false;//是否需要scanf的标记
    int num=0;//第几个需要查询的
    int now=0;//现在在valid的下标
    for(int i=0;i<K;i++)
    {
        scanf("%d:%d:%d",&hour,&minute,&second);
        time=3600*hour+minute*60+second;
        while(now<valid_num && time>=Valid[now].time)
        {
            if(Valid[now].flag==0)
                now_car++;
            else
                now_car--;
            now++;
        }
        printf("%d\n",now_car);
    }


    for(auto it=ParkTime.begin();it!=ParkTime.end();it++)
    {
        if(it->second == length_time)
            printf("%s ",it->first.c_str());

    }
    printf("%02d:%02d:%02d",length_time/3600,(length_time % 3600)/60,(length_time)%60);
    return 0;
}


你可能感兴趣的:(PAT)