http://www.patest.cn/contests/pat-a-practise/1095
题目很简单,但是要注意切入的姿势,T T
先按车牌排序,再按时间排序,判断相邻的是否是in-out匹配
cnt用来计数
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<map> using namespace std; #define maxn 10010 #define maxntime 24*60*60 struct ss { char id[20]; char time_ch[20]; int time; char op[5]; int id_hash; }a[maxn]; int n,m; int cnt[maxntime]; map<string,int>mp; map<string,int>::iterator it; int gettime(char t[]) { int hh=(t[0]-'0')*10+t[1]-'0'; int mm=(t[3]-'0')*10+t[4]-'0'; int ss=(t[6]-'0')*10+t[7]-'0'; return hh*3600+mm*60+ss; } bool cmp(ss x,ss y) { if(strcmp(x.id,y.id)==0) { return x.time<y.time; } return strcmp(x.id,y.id)<0; } int main() { while(~scanf("%d%d",&n,&m)) { memset(cnt,0,sizeof(cnt)); mp.clear(); for(int i=0;i<n;i++){ scanf("%s%s%s",a[i].id,a[i].time_ch,a[i].op); a[i].time=gettime(a[i].time_ch); } sort(a,a+n,cmp); // puts("----------------------------------------------------"); // for(int i=0;i<n;i++)printf("%s %s %s\n",a[i].id,a[i].time_ch,a[i].op); // puts("----------------------------------------------------"); for(int i=1;i<n; ) { if(strcmp(a[i].id,a[i-1].id)==0&&a[i].op[0]=='o'&&a[i-1].op[0]=='i') { cnt[a[i-1].time]++; cnt[a[i].time]--; string id_str=a[i].id; mp[id_str]+=a[i].time-a[i-1].time; i+=2; } else i++; } for(int i=1;i<maxntime;i++)cnt[i]+=cnt[i-1]; char t[20]; int time; while(m--) { scanf("%s",t); time=gettime(t); printf("%d\n",cnt[time]); } int ma=0; for(it=mp.begin();it!=mp.end();it++) { if(it->second>ma)ma=it->second; } for(it=mp.begin();it!=mp.end();it++) { if(it->second==ma) { printf("%s ",it->first.c_str()); } } printf("%02d:%02d:%02d\n",ma/3600,ma%3600/60,ma%60); } return 0; }