題目大意:
給出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;
}