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

被折叠的 条评论
为什么被折叠?



