题目大意:
给出n个⻋牌号、时间点、进出状态的记录,然后查询k个时间点这时校园内的⻋辆个数。
最后还要输出在校园⾥⾯呆的时间最⻓的⻋的⻋牌号,以及呆了多久的时间。如果有多辆⻋就按照它
的字⺟从⼩到⼤输出⻋牌
知识点笔记
- vector
vector <string> v;
for(int i=0;i!=v.end();i++)
这种类型是不支持的,因为i和vector的类型不同,v.end()返回的是最后一个点的值,并不是索引。v.begin() 和v.end()均指向值,而v.size()指向个数
":: : "在C++中表示作用域,和所属关系
std:: 是个名称空间标示符,C++标准库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准函数库中的函数或对象都要使用std来限定。
vector::iterator : 向量型作用下的迭代器
段错误:很大程度上可能为未考虑到0,1等的情况,可以试着往这方面改进。
注意点
- 刚开始想简单了,在配对的时候,有很多进入和出去的记录,取两个相邻最近的。如:进1 进2 进3 出1 出2 进4 出3 。则有效数据为 进3 出1 进4 出3。这个点,非常重要,以后看题的时候,可以试着用样例验证自己的结论,来完全理解题意。
#include <cstdio>
#include<algorithm>
#include<iostream>
#include<string>
#include<set>
#include<vector>
#include<map>
using namespace std;
struct node
{
string name;
int h,m,s;
int num;
int status;
}time1[100000];
set<string> set1;
int cmp1(node &t1, node &t2)
{
if(t1.num!=t2.num) return t1.num<t2.num;
return t1.name<t2.name;
}
int cmp2(node &t1, node &t2)
{
if(t1.name!=t2.name) return t1.name<t2.name;
return t1.num<t2.num;
}
int main() {
int n,k;
string s,s1;
int ht,mt,st;
scanf("%d %d",&n, &k);
int query[k];
for(int i=0;i<n;i++)
{
cin>>s;
scanf("%d:%d:%d",&ht, &mt, &st);
cin>>s1;
if(s1=="in")time1[i].status=1;
else time1[i].status=0;
int num=ht*60*60+mt*60+st;
time1[i]={s,ht,mt,st,num,time1[i].status};
}
sort(time1,time1+n,cmp2);
int maxx=-1;
vector<node> car;
vector<string> v;
map<string,int> m;
for(int i=0;i<n;i++)
if(time1[i].name==time1[i+1].name && time1[i].status==1 &&time1[i+1].status==0)
{
car.push_back(time1[i]);
car.push_back(time1[i+1]);
m[time1[i].name]+=time1[i+1].num-time1[i].num;
if(maxx<m[time1[i].name])
{
maxx=m[time1[i].name];
v.clear();
v.push_back(time1[i].name);
}
else if(maxx==m[time1[i].name])
{
v.push_back(time1[i].name);
}
}
for(int i=0;i<k;i++)
{
scanf("%d:%d:%d",&ht, &mt, &st);
int num=ht*60*60+mt*60+st;
car.push_back({"a",0,0,0,num,-1});
}
sort(car.begin(),car.end(),cmp1);
int total=0;
for(int i=0;i<car.size();i++)
{
if(car[i].status==1) total++;
if(car[i].status==0) total--;
if(car[i].status==-1) cout<<total<<endl;
}
for(int i=0;i<v.size();i++)
cout<<v[i]<<" ";
printf("%02d:%02d:%02d",maxx/3600,(maxx%3600)/60,maxx%60);
return 0;
}