码迷,mamicode.com
首页 > 其他好文 > 详细

PAT A1095

时间:2021-07-21 17:35:37      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:alt   而不是   mamicode   最大   clu   begin   没有   time   c_str   

题目链接

技术图片

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\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);

}

PAT A1095

标签:alt   而不是   mamicode   最大   clu   begin   没有   time   c_str   

原文地址:https://www.cnblogs.com/zhmlzhml/p/15037325.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!