题目地址:http://www.patest.cn/contests/pat-a-practise/1095
这题处理起来比较繁,充分考察C++ STL 的使用
下面是ac代码,仍需要大量优化
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <math.h>
#include <string>
#include <string.h>
#include <queue>
#include <unordered_map>
#include <algorithm>
using namespace std;
#define N 10001
#define K 80001
int n, kk;
struct jilu{
//plate_number hh : mm : ss status // in-true out-false
string plate_number;
int hh, mm, ss;
bool state;
};
vector<jilu> v;
//unordered_map<string, int> umstr2int;
//unordered_map<int, string> umint2str;
struct timet{
int hh, mm, ss;
timet(int _hh = 0, int _mm = 0, int _ss = 0)
{
hh = _hh;
mm = _mm;
ss = _ss;
}
};
bool cmp(jilu j1, jilu j2)
{
if (j1.hh < j2.hh)
return true;
if (j1.hh == j2.hh && j1.mm < j2.mm)
return true;
if (j1.hh == j2.hh && j1.mm == j2.mm && j1.ss < j2.ss)
return true;
return false;
}
bool cmp2(jilu j1, jilu j2)
{
if (j1.plate_number < j2.plate_number)
return true;
if (j1.plate_number == j2.plate_number){
if (j1.hh < j2.hh)
return true;
if (j1.hh == j2.hh && j1.mm < j2.mm)
return true;
if (j1.hh == j2.hh && j1.mm == j2.mm && j1.ss < j2.ss)
return true;
}
return false;
}
bool cmptimet(timet j1,timet j2)
{
if (j1.hh < j2.hh)
return true;
if (j1.hh == j2.hh && j1.mm < j2.mm)
return true;
if (j1.hh == j2.hh && j1.mm == j2.mm && j1.ss <= j2.ss)
return true;
return false;
}
int gettimet(int hh, int mm, int ss)
{
return hh * 3600 + mm * 60 + ss;
}
int main()
{
//freopen("in", "r", stdin);
scanf("%d%d", &n, &kk);
int i, j;
jilu jit;
char statet[4];
for (i = 0; i < n; i++)
{
cin >> jit.plate_number;
scanf("%d:%d:%d", &jit.hh, &jit.mm, &jit.ss);
scanf("%s", statet);
if (statet[0] == 'i')
jit.state = true;
else
jit.state = false;
if (gettimet(jit.hh, jit.mm, jit.ss) >= gettimet(0, 0, 0) &&
gettimet(jit.hh, jit.mm, jit.ss) < gettimet(24, 0, 0))
{
v.push_back(jit);
}
}
// 下面是处理那些不匹配的
sort(v.begin(), v.end(), cmp2);
vector<jilu> v2;
string curname = "";
bool flag = false;
for (i = 0; i < n; i++)
{
jilu jtmp = v[i];
if (flag == false && jtmp.state == true)
{
v2.push_back(jtmp);
flag = true;
curname = jtmp.plate_number;
}
else if (flag == true && jtmp.state == true){
v2.pop_back();
v2.push_back(jtmp);
flag = true;
curname = jtmp.plate_number;
}
else if (flag == true && jtmp.plate_number == curname && jtmp.state == false)
{
v2.push_back(jtmp);
flag = false;
}
}
if ((*(v2.end() - 1)).state == true)
v2.pop_back();
// v2 处理完毕
int maxx = 0;
vector<string> rs;
//vector<int> rs2;
//vector<timet> rs3;
unordered_map<string, int> um;
int len2 = v2.size();
timet tt;
for (i = 0; i < len2; i+=2)
{
jilu t1 = v2[i];
jilu t2 = v2[i + 1];
int totaltimet = gettimet(t2.hh, t2.mm, t2.ss) - gettimet(t1.hh, t1.mm, t1.ss);
//rs.push_back(t1.plate_number);
//rs2.push_back(totaltimet);
tt.hh = t2.hh;
tt.mm = t2.mm;
tt.ss = t2.ss;
//rs3.push_back(tt);
um[t1.plate_number] += totaltimet;
if (um[t1.plate_number] > maxx)
{
rs.clear();
rs.push_back(t1.plate_number);
maxx = um[t1.plate_number];
}
else if (um[t1.plate_number] == maxx){
rs.push_back(t1.plate_number);
}
}
// 对 v2的每一个时间点 都记录下Cars
sort(v2.begin(), v2.end(), cmp);
// 时间段 人数
int len22 = v2.size();
int num = 0;
vector<int> nums; // 按照 v2 排序后的时间进行统计
for (i = 0; i < len22; i++)
{
if (v2[i].state)
{
num++;
}
else{
num--;
}
nums.push_back(num);
}
timet ttmp;
int numm = 0;
for (i = 0; i < kk; i++)
{
scanf("%d:%d:%d", &ttmp.hh, &ttmp.mm, &ttmp.ss);
for (j = numm; j < len2; j++)
{
timet tmp;
tmp.hh = v2[j].hh;
tmp.mm = v2[j].mm;
tmp.ss = v2[j].ss;
if (cmptimet(tmp, ttmp))
{
numm++;
// 下面两句不写 会出错 因为可能查询时间比输入的最大时间都大 ,不会跳到下面的else里面去
if (j == len2 - 1)
printf("%d\n", nums[numm - 1]);
}
else{
printf("%d\n", nums[numm - 1]);
break;
}
}
}
int rsLen = rs.size();
for (i = 0; i < rsLen; i++)
{
cout << rs[i] << " ";
}
int h = maxx / 3600;
int m = maxx / 60 - h * 60;
int s = maxx % 60;
printf("%02d:%02d:%02d\n",h,m,s);
return 0;
}