您的位置:首页 > 博客中心 > 互联网 >

PAT A1095

时间:2022-05-11 13:02

技术图片

30分的题,喜大普奔

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

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

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

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

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

tips:

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

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

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

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


#include
#include
#include 
#include 
#include 
#include 
#include 
using namespace std;
//转换成以秒为单位
//询问是按升序给出的
struct Car{
    char id[10];
    int time;
    bool in_1;

}cars[100000];
map 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.timenowtime){
                now_comp=j;
                break;
            }

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

    }
    map::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);

}

本类排行

今日推荐

热门手游