这个大模拟写的爽呀
看题目戳这
不愧为30分甲级题
百行代码
精髓在于map寻找成对的数据和map累加nowcar
注意输入的询问时间一定是递增的
所以这里要省一下时间,不然会t
代码如下
#include<bits/stdc++.h>
using namespace std;
struct node{
char id[10];
int h,m,s,op,t;
}p[10004];
map<string,node> ma;
map<string,int> mt;
map<int,int> mi;
map<int,int> mo;
string ans[10004];
bool cmp(node x,node y){
if(x.t!=y.t){
return x.t<y.t;
}else {
return strcmp(x.id,y.id)<0;
}
}
int change(node x){
int res=x.h*3600+x.m*60+x.s;
return res;
}
int nchange(int res,int &h,int &m,int &s){
h=res/3600;
res-=h*3600;
m=res/60;
res-=m*60;
s=res;
}
int main(){
int n,k,h,m,s,t;
char op[5],id[10];
scanf("%d%d",&n,&k);
getchar();
for(int i=0;i<n;i++){
scanf("%s%d:%d:%d%s",p[i].id,&p[i].h,&p[i].m,&p[i].s,op);
if(op[0]=='o'){
p[i].op=1;
}
p[i].t=change(p[i]);
}
sort(p,p+n,cmp);
for(int i=0;i<n;i++){
strcpy(id,p[i].id);
if(p[i].op==0){
ma[id]=p[i];
}else if(ma.find(id)!=ma.end()&&p[i].op==1){
mt[id]+=(p[i].t-ma[id].t);
mi[ma[id].t]++;
mo[p[i].t]++;
ma.erase(id);
}
}
map<int,int>::iterator it1=mi.begin();
map<int,int>::iterator it2=mo.begin();
int nowcar=0;
for(int i=0;i<k;i++){
scanf("%d:%d:%d",&h,&m,&s);
node now;
now.h=h;
now.m=m;
now.s=s;
t=change(now);
for(it1;it1!=mi.end();it1++){
if((it1->first)<=t){
nowcar=nowcar+(it1->second);
}else {
break;
}
}
for(it2;it2!=mo.end();it2++){
if((it2->first)<=t){
nowcar=nowcar-(it2->second);
}else {
break;
}
}
printf("%d\n",nowcar);
}
int maxn=0,cnt=0;
for(map<string,int>::iterator it=mt.begin();it!=mt.end();it++){
if((it->second)>maxn){
maxn=(it->second);
}
}
for(map<string,int>::iterator it=mt.begin();it!=mt.end();it++){
if((it->second)==maxn){
ans[cnt++]=(it->first);
}
}
for(int i=0;i<cnt;i++){
printf("%s",ans[i].c_str());
printf(" ");
}
nchange(maxn,h,m,s);
printf("%02d:%02d:%02d",h,m,s);
return 0;
}
/*
6 5
JH007BD 05:09:59 in
JH007BD 05:10:33 in
JH007BD 12:23:42 out
JH007BD 12:24:23 out
JH007BD 18:00:01 in
JH007BD 18:07:01 out
*/