pat1095 Cars on Campus

题意:有一些车的停放记录,给出K个询问时间,每个询问查询当前时刻有多少车停放,停放记录只有相邻两个进出记录有效,最后输出停放时间最长的车以及停放时间。

思路:先把停放记录排序,选出相邻的合法记录,遍历一遍即可得出最长的停放时间及车辆,询问按照从小到大,所以也只要遍历一遍就能得到。

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <climits>
#include <vector>
#include <set>

using namespace std;

const int MAX_N = 10100;
const int MAX_Q = 80100;

int toI(char s[]) {
    int h = (s[0]-'0')*10+(s[1]-'0');
    int m = (s[3]-'0')*10+(s[4]-'0');
    int t = (s[6]-'0')*10+(s[7]-'0');
    return (h*60*60)+m*60+t;
}

void toS(int q) {
    int t = q % 60; q /= 60;
    int m = q % 60; q /= 60;
    int h = q;
    printf("%02d:%02d:%02d", h, m, t);
}

struct Rec {
    char id[10];
    int tim;
    bool in;

    bool operator < (const Rec& rec) const {
        return tim < rec.tim;
    }
}rec[MAX_N], tmp[MAX_N];
int len = 0;

int N, K;
char tim[10], in[5];

map<string, int> inT;
map<string, int> ti;
int query[MAX_Q];
int ans[MAX_Q];
vector<string> ids;
int maxT;

int main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    scanf("%d %d", &N, &K);
    for (int i = 0; i < N; i++) {
        scanf("%s %s %s", rec[i].id, tim, in);
        rec[i].tim = toI(tim);
        rec[i].in = (in[0]=='i'?true:false);
    }
    sort(rec, rec+N);
    for (int i = 0; i < K; i++) {
        scanf("%s", tim);
        query[i] = toI(tim);
    }
    query[K] = INT_MAX;
    int ind = 0, last;
    for (int i = 0; i < N; i++) {
        if (rec[i].in) {
            inT[rec[i].id] = rec[i].tim;
        } else {
            if (inT.count(rec[i].id)) {
                ti[rec[i].id] += rec[i].tim - inT[rec[i].id];
                tmp[len].tim = inT[rec[i].id]; tmp[len].in = 1; len++;
                tmp[len].tim = rec[i].tim; tmp[len].in = 0; len++;
                inT.erase(rec[i].id);
            }
        }
    }
    sort(tmp, tmp + len);
    int ct = 0;
    for (int i = 0; i < len; i++) {
        if (tmp[i].in) {
            ct++;
        } else {
            ct--;
        }
        while (ind < K && tmp[i].tim > query[ind]) {
            ans[ind] = ct + (tmp[i].in?-1:1); ind++;
        }
    }
    while (ind < K) {
        ans[ind] = ct; ind++;
    }
    maxT = 0;
    for (auto it = ti.begin(); it != ti.end(); it++) {
        if (it->second > maxT) {
            maxT = it->second;
            ids.clear(); ids.push_back(it->first);
        } else if (it->second == maxT) {
            ids.push_back(it->first);
        }
    }
    sort(ids.begin(), ids.end());
    for (int i = 0; i < K; i++) {
        printf("%d\n", ans[i]);
    }
    for (int i = 0; i < ids.size(); i++) {
        printf("%s ", ids[i].c_str());
    }
    toS(maxT); printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/csx0987/article/details/82458430