一道排序问题,涉及到时间的处理和结构体数组的排序
坑点如下
1,结构体数组的排序,按照车牌号字母顺序排,如相同则按照时间来排,
比较函数如下
bool cmp(node a,node b){
if(strcmp(a.id,b.id)!=0) return strcmp(a.id,b.id)<0;
else return a.time<b.time;
}
2,通过对时间和状态从大到小排序后,根据状态判断前一个为in后一个为out的车辆,并将这一车辆记录。
3,测试点三一直无法通过,后来发现是query数组开小了,由题意开到80010后成功通过
整体代码如下
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
const int maxn=10010;
const int maxk=80010;
struct node{
char id[10];
int time;
char status[5];
}cars[maxn],valid[maxn];
bool cmp(node a,node b){
if(strcmp(a.id,b.id)!=0) return strcmp(a.id,b.id)<0;
else return a.time<b.time;
}
int query[maxk];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
int h,m,s;
int timenow;
for(int i=0;i<n;i++)
{
scanf("%s %d:%d:%d %s",cars[i].id,&h,&m,&s,cars[i].status);
timenow=h*3600+m*60+s;
cars[i].time=timenow;
}
for(int i=0;i<k;i++)
{
scanf("%d:%d:%d",&h,&m,&s);
timenow=h*3600+m*60+s;
query[i]=timenow;
}
sort(cars,cars+n,cmp);
map<string,int>mp;
int num=0;
int maxtime=-1;
for(int i=0;i<n-1;i++){
if(strcmp(cars[i].status,"in")==0&&strcmp(cars[i+1].status,"out")==0&&strcmp(cars[i+1].id,cars[i].id)==0)
{
valid[num++].time=cars[i].time;
valid[num++].time=cars[i+1].time;
if(mp.count(cars[i].id)==0)
{
mp[cars[i].id]=0;
}
mp[cars[i].id]+=cars[i+1].time-cars[i].time;
maxtime=max(mp[cars[i].id],maxtime);
}
}
for(int i=0;i<k;i++){
int carsnow=0;
for(int l=0;l<num;l+=2){
if(valid[l].time<=query[i]&&valid[l+1].time>query[i])
{ carsnow++;}
}
printf("%d\n",carsnow);
}
map<string,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++){
if(it->second==maxtime)
{ printf("%s ",it->first.c_str());
}
}
printf("%02d:%02d:%02d\n",maxtime/3600,maxtime%3600/60,maxtime%60);
return 0;
}