PAT A1095

时间:2021-07-21 17:35:37   收藏:0   阅读:0

题目链接

技术图片

30分的题,喜大普奔

总思路的话,就是读入一堆信息以后,先按id/time(这个的意思是先排序Id,再排序time)的顺序sort一下,然后找两两配对放进一个数组里,这个时候你也要记录下时间来。然后跑一遍那个数组就可以找出所有最大。至于询问的话就跑一遍那个时间数组。

这个题想想思路也不是很费劲嘛,就提几个注意点吧。

tips:

*啊,要注意iterator的写法
技术图片


#include<iostream>
#include<vector>
#include <unordered_set>
#include <map>
#include <cstring>
#include <stdio.h>
#include <algorithm>
using namespace std;
//转换成以秒为单位
//询问是按升序给出的
struct Car{
    char id[10];
    int time;
    bool in_1;

}cars[100000];
map<string,int> mmp;
int change_to_s(int h,int m,int s){
    return h*3600+m*60+s;
}
bool cmpbyidandtime(Car car1,Car car2){
    if(strcmp(car1.id,car2.id))
        return strcmp(car1.id,car2.id)<0;//从小到大排序
    else{
        return car1.time<car2.time;
    }
}
bool cmpbytime(Car car1,Car car2){
    return car1.time<car2.time;
}
int main(){
    int car_num;
    int q_num;
    scanf("%d %d",&car_num,&q_num);
    for (int i = 0; i < car_num; ++i) {
        char temp[100];
        int h;
        int m;
        int s;
        scanf("%s %d:%d:%d %s",cars[i].id,&h,&m,&s,temp);
        cars[i].time=change_to_s(h,m,s);
        if(temp[0]==‘o‘){
            cars[i].in_1= false;
        }
        else{
            cars[i].in_1= true;
        }

    }
    sort(cars,cars+car_num,cmpbyidandtime);
    int maxn;
    Car valid[100000];//record the car,,,,直接声明成Car形就可以
    int num=0;
    for (int i = 1; i < car_num; ++i) {
        if(!strcmp(cars[i].id,cars[i-1].id) && cars[i-1].in_1== true && cars[i].in_1== false){
            if(mmp.count(cars[i].id)==0){
                mmp[cars[i].id]=0;
            }
            valid[num++]=cars[i-1];
            valid[num++]=cars[i];
            mmp[cars[i].id]+=(cars[i].time-cars[i-1].time);//注意同一辆车可能开进来很多次
            maxn=max(mmp[cars[i].id],maxn);

        }

    }
    sort(valid,valid+num,cmpbytime);
    //输出valid的所有信息 ok
//    for (int i = 0; i < num; ++i) {
//        cout<<valid[i].id<<" "<<valid[i].time<<" "<<valid[i].in_1<<endl;
//    }
    int now_comp=0;
    int now_car=0;
    for (int i = 0; i < q_num; ++i) {
        int h;
        int m;
        int s;
        scanf("%d:%d:%d",&h,&m,&s);
        int nowtime=change_to_s(h,m,s);
        //输出时间
        //cout<<"nowtime"<<nowtime<<endl;
        for (int j = now_comp; j < num; ++j) {//因为询问升序,每次保留当前记录就行
            if(valid[j].time<=nowtime && valid[j].in_1)//in_time<nowtime,now_car++
                now_car++;

            if(valid[j].time<=nowtime && !valid[j].in_1){
                now_car--;
            }
            if(valid[j].time>nowtime){
                now_comp=j;
                break;
            }

    }
        printf("%d\n",now_car);

    }
    map<string,int>::iterator it;
    for(it =mmp.begin();it!=mmp.end();it++){
        if(it->second==maxn)
            printf("%s ",it->first.c_str());

    }
    printf("%02d:%02d:%02d",maxn/3600,maxn%3600/60,maxn%60);

}

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!