1095. Cars on Campus (30)

看了几个别人写的,感觉这个还不错

http://blog.csdn.net/xyt8023y/article/details/48029443

写一次理解:

1.首先把这N条记录存储起来,按时间从小到大排序,时间统计转换为秒

2.遍历该N条记录,存放到map中,有in,有out,且inTime<outTime为一条完整的有效记录,把有效记录存起来;并同时计算该车的停车时间(同一个车可能同时进出多次)

3.按时间从小到大的顺便排序2中存的有效记录,截止到查询时间,算出到此刻里面的车数

4.将2中的有效记录车存起来,从大到小排序他的总停车时间,有多个最大停车时间的车存起来,进行输出,最后输出最大的停车时间


CODE

#include <iostream>
#include <stdio.h>
#include <vector>
#include <map>
#include <algorithm>
#include <string.h>

using namespace std;

struct Car{
    string plate_num;
    bool valid; 
    int inTime;
    int outTime;
    int total;

    Car(){
        valid = false;
        inTime = outTime = -1;
        total = 0;
    }

    bool operator < (const Car& other) const{
        return total > other.total;
    }

};

struct Record{
    string plate_num;
    int time;
    char *state;

    Record(string plate, int t, char *s){

        plate_num = plate;
        time = t;
        state = s;
    }

    bool operator < (const Record& other) const {
        return time < other.time;
    }

};

struct QueryNode{
    int time;
    int value;

    QueryNode(int t, int v){
        time = t;
        value = v;
    }

    bool operator < (const QueryNode& other) const{
        return time < other.time;
    }
};

int main()
{
	#ifndef ONLINE_JUDGE
	freopen("input.txt","r",stdin);
	#endif
	    
	int N,K;
    scanf("%d %d",&N,&K);
    
    vector<Record> records;
	int h,m,s;
    for(int i = 0; i < N; i++){
        string plate_num;
        char *state = new char[2];
        cin >> plate_num;
        scanf("%d:%d:%d %s",&h,&m,&s,state);
        records.push_back(Record(plate_num,h * 3600 + m * 60 + s,state));
    }
    sort(records.begin(),records.end());//把记录按时间顺序排序 
    
    map<string,Car> carMap;
    vector<QueryNode> queryNodes;
    for(int i = 0; i < records.size(); i++){
        Record &r = records[i];//&表示引用,给record[i]起了一个名字叫r,不是一个新的变量,不分配存储空间 
        if(r.state[0] == 'i'){ // in
            if(carMap.find(r.plate_num) == carMap.end()){//map中不存在该车 
                Car c=Car();
                c.plate_num = r.plate_num;
                c.inTime = r.time;
                carMap[r.plate_num] = c;
            }else{
                Car &c=carMap[r.plate_num];
                c.inTime = r.time;//原来的inTime被覆盖 
            }
        }else{ // out
            if(carMap.find(r.plate_num) == carMap.end()){
                Car c = Car();
                c.plate_num = r.plate_num;
                c.outTime = r.time;
                carMap[r.plate_num] = c;
            }else{
                Car &c = carMap[r.plate_num];
                c.outTime = r.time;
                if(c.inTime != -1 && c.inTime < c.outTime){//是一条完整的有效记录 
                    QueryNode inQ = QueryNode(c.inTime,1);
                    QueryNode outQ = QueryNode(c.outTime,-1);
                    queryNodes.push_back(inQ);
                    queryNodes.push_back(outQ);
                    c.total += c.outTime - c.inTime;
                    c.inTime = c.outTime = -1;//重置 
                    c.valid = true;
                }
            }
        }
    }
    sort(queryNodes.begin(),queryNodes.end());
   
    int cnt = 0;
    int cur = 0;
    for(int i = 0 ; i < K; i++){
        scanf("%d:%d:%d",&h,&m,&s);
        int t = h*3600+m*60+s;
        while(cur<queryNodes.size()){
            QueryNode q=queryNodes[cur];
            if(q.time<=t){
                cnt+= q.value;
                cur++;
            }else{
                break;
            }
        }
        printf("%d\n",cnt);
    }

	vector<Car> validCars;
    for(map<string,Car>::iterator it = carMap.begin(); it != carMap.end(); it++){
        Car &c = it->second;
        if(c.valid){
            Car c = it->second;
            validCars.push_back(c);
        }
    }
    sort(validCars.begin(),validCars.end());
    
    int maxTotal = validCars[0].total;
    vector<string> carList;
    carList.push_back(validCars[0].plate_num);
    for(int i=1;i<validCars.size();i++){
        Car c=validCars[i];
        if(c.total==maxTotal){
            carList.push_back(c.plate_num);
        }else{
            break;
        }
    }
    sort(carList.begin(),carList.end());
    
    for(int i = 0; i < carList.size(); i++){
        printf("%s ",carList[i].c_str());
    }
    h = maxTotal / 3600;
    m = (maxTotal - h * 3600) / 60;
    s = maxTotal % 60;
    printf("%02d:%02d:%02d\n",h,m,s);
    
   	#ifndef ONLINE_JUDGE
	fclose(stdin);
	#endif
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值