目录
1.Cars on Campus
这一题也是比较复杂的逻辑题了。
下次还得再做一遍
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=10010;
struct car{
char id[8];
int time;
char status[4];
}all[maxn],valid[maxn];
int num=0;
map<string,int> parktime;
int timetoint(int hh,int mm,int ss){
return hh*3600+mm*60+ss;
}
bool cmpbyidandtime(car a,car b){
if(strcmp(a.id,b.id)) return strcmp(a.id,b.id)<0;
else return a.time<b.time;
}
bool cmpbytime(car a,car b){
return a.time<b.time;
}
int main(){
int n,k;
scanf("%d %d",&n,&k);
int hh,mm,ss;
for(int i=0;i<n;i++){
scanf("%s %d:%d:%d %s",&all[i].id,&hh,&mm,&ss,&all[i].status);
all[i].time=timetoint(hh,mm,ss);
}
//先根据id再根据时间排名
sort(all,all+n,cmpbyidandtime);
int maxtime=-1;
for(int i=0;i<n-1;i++){
//如果连着的两条记录是同一个人,并且前面是in后面是out,那么就加入到valid数组中去
if(!strcmp(all[i].id,all[i+1].id)&&
!strcmp(all[i].status,"in")&&
!strcmp(all[i+1].status,"out")){
valid[num++] = all[i];
valid[num++] = all[i+1];
int intime=all[i+1].time-all[i].time;
//如果这个人还没有进入过,但现在进来了,那就初始化一个0
if(parktime.count(all[i].id)==0){
parktime[all[i].id]=0;
}
parktime[all[i].id]+=intime;
maxtime=max(maxtime,parktime[all[i].id]);
}
}
//再根据时间给有效记录的数组排个序
sort(valid,valid+num,cmpbytime);
//now是不超过查询时间的记录
int now=0,numcar=0;
for(int i=0;i<k;i++){
scanf("%d:%d:%d",&hh,&mm,&ss);
int time=timetoint(hh,mm,ss);
while(now<num&&valid[now].time<=time){
if(!strcmp(valid[now].status,"in")) numcar++;
else numcar--;
now++;
}
printf("%d\n",numcar);
}
map<string,int>::iterator it;
for(it=parktime.begin();it!=parktime.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;
}