• PAT A1095


    题目链接

    30分的题,喜大普奔

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

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

    • 这个是我当时的一个坑,就是如果那个车没有匹配的in & out,它都不会参与数车,也就是说,这个筛选你需要在所有东西之前进行


    • 要注意同一辆车可能要开进来很多次,所以你得去找map里的匹配,然后去加,而不是每次都重新找一个匹配。

    • 这个题一个卡时间的地方就是询问。其实询问是升序的话就跑一遍就可以了

    tips:

    • 把时间变成秒可以简化很多!!!!这是处理时间的一个技巧。

    • 如果只需要输出一个最大值(可能是按某种排序排出来的),那只需要跑一遍数组就可以、(一直记录一个maxn)
      如果需要全部输入那就得跑两遍,先找maxn,再找所有与maxn相等的值(但是你可以输入的时候就把那个maxn找出来)

    • printf不能直接输出char *类型,所以你需要一个函数:

    *啊,要注意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
    ",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);
    
    }
    
    
    为了自己,和那些爱你的人
  • 相关阅读:
    在HTML文件中加载js
    HTML表单的问题
    HTML自动换行的问题
    HTML的结束标签问题
    数据库基本知识
    PHP中数据库的连接
    2014年7月
    3.2版本视频讲解知识点
    2014年7月
    选项卡
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/15037325.html
Copyright © 2020-2023  润新知