题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805371602845696
注意
-
相较于参考文章,我采用了string替代字符数组,方便比较;但对于string的输入还是不能用scanf,即使网上有scanf获取string类型字符串的方法,但都需要用c_str(),string类型的变量本身仍然是空的(无法比较),所以还是要用cin
-
printf("%d\n",i==0?0:cnt[i-1]);
这行代码我进行了修改,保证j为0时不会出现越界的情况 -
这里的map不能为了加快查询时间而改为unordered_map,因为最终输出时需要按照字母大小排序
AC代码
#include<bits/stdc++.h>
using namespace std;
struct node{
string id;
int time,flag=0;
};
int cmp1(node x,node y){
if(x.id!=y.id) return x.id<y.id;
else return x.time<y.time;
}
int cmp2(node x,node y){
return x.time<y.time;
}
int main()
{
int n,k,mtime=-1,tindex=0;
cin>>n>>k;
vector<node> record(n),car;
for(int i=0;i<n;i++)
{
string tmp;
int h,m,s;
cin>>record[i].id;
scanf("%d:%d:%d",&h,&m,&s);
cin>>tmp;
int ttime=h*3600+m*60+s;
record[i].time=ttime;
record[i].flag= tmp=="in"?1:-1;
}
sort(record.begin(),record.end(),cmp1);
map<string,int> f;
for(int i=0;i<n-1;i++)
{
if(record[i].id==record[i+1].id&record[i].flag==1&&record[i+1].flag==-1)
{
car.push_back(record[i]);
car.push_back(record[i+1]);
f[record[i].id]+=record[i+1].time-record[i].time;
if(mtime<f[record[i].id])
mtime=f[record[i].id];
}
}
sort(car.begin(),car.end(),cmp2);
vector<int> cnt(n);
for(int i=0;i<car.size();i++)
{
if(i==0) cnt[i]=car[i].flag;
else cnt[i]=cnt[i-1]+car[i].flag;
}
while(k--)
{
int h,m,s;
scanf("%d:%d:%d",&h,&m,&s);
int ttime=h*3600+m*60+s,i;
for(i=tindex;i<car.size();i++)
{
if(car[i].time>ttime)
{
printf("%d\n",i==0?0:cnt[i-1]);
break;
}
else if(i==car.size()-1)
printf("%d\n",cnt[i]);
}
tindex=i;
}
for(auto it:f)
{
if(it.second==mtime)
cout<<it.first<<" ";
}
printf("%02d:%02d:%02d",mtime/3600,(mtime%3600)/60,mtime%60);
}