PATA1095题解

本文介绍了一个基于C++实现的排序题目解答,该题目为PATA1095,主要涉及车辆进出停车场的时间记录处理。通过定义结构体来存储车辆ID和时间信息,并使用两种自定义比较函数进行排序,最终统计并输出特定时间段内停车场内的车辆数量及最长停留时间的车辆ID。

排序题

//
//  main.cpp
//  PATA1095
//
//  Created by Phoenix on 2018/2/21.
//  Copyright © 2018年 Phoenix. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 10010;
int n, k;
int car_time[maxn] = {0};
struct node {
    string id;
    int time;
    int flag;
    int exist;
}car[maxn];

bool cmp1(node a, node b) {
    if(a.id != b.id) return a.id < b.id;
    else return a.time < b.time;
}

bool cmp2(node a, node b) {
    if(a.exist != b.exist) return a.exist > b.exist;
    else return a.time < b.time;
}

int main(int argc, const char * argv[]) {
    scanf("%d %d", &n ,&k);
    int hh, mm, ss;
    char statue[4];
    for(int i = 0; i < n; i++) {
        cin >> car[i].id;
        scanf("%d:%d:%d %s", &hh, &mm, &ss, statue);
        car[i].time = 3600 * hh + 60 * mm + ss;
        car[i].exist = 0;
        if(statue[0] == 'i') car[i].flag = 0;
        else car[i].flag = 1;
    }
    sort(car, car + n, cmp1);
    map<string, int> mp1;
    map<int, string> mp2;
    int car_num = 0;
    for(int i = 0; i < n - 1; i++) {
        if(car[i].id == car[i + 1].id) {
            if(car[i].flag == 0 && car[i + 1].flag == 1) {
                car[i].exist = 1;
                car[i + 1].exist = 1;
                if(mp1.find(car[i].id) == mp1.end()) {
                    mp1[car[i].id] = car_num;
                    mp2[car_num] = car[i].id;
                    car_time[car_num] = car[i + 1].time - car[i].time;
                    car_num++;
                }else{
                    car_time[mp1[car[i].id]] += car[i + 1].time - car[i].time;
                }
            }
        }
    }
    sort(car, car + n, cmp2);
    int num = 0, s = 0, t = 0;
    int time;
    scanf("%d:%d:%d", &hh, &mm, &ss);
    time = 3600 * hh + 60 * mm + ss;
    for(int i = 0; i < 24 * 60 * 60; i++) {
        while(car[s].time == i && car[s].exist == 1) {
            if(car[s].flag == 0) num++;
            else num--;
            //printf("%d\n", num);
            s++;
        }
        if(time == i) {
            printf("%d\n", num);
            if(t < k - 1) scanf("%d:%d:%d", &hh, &mm, &ss);
            time = 3600 * hh + 60 * mm + ss;
            t++;
        }
        if(t == k) break;
    }
    vector<string> v;
    int optvalue = 0;
    for(int i = 0; i < car_num; i++) {
        if(car_time[i] > optvalue) {
            v.clear();
            optvalue = car_time[i];
            v.push_back(mp2[i]);
        } else if(car_time[i] == optvalue){
            v.push_back(mp2[i]);
        }
    }
    sort(v.begin(), v.end());
    for(int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    printf("%02d:%02d:%02d\n", optvalue / 3600, (optvalue % 3600) / 60, optvalue % 60);
    return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值