第一次用map的题目,好好回味!
#include<cstdio>
#include<vector>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
struct car
{
char id[8];
int time;
int status;
};
bool cmp1(car a,car b)
{
if(strcmp(a.id,b.id)) return strcmp(a.id,b.id)<0;
else return a.time<b.time;
}
bool cmp2(car a,car b)
{
return a.time<b.time;
}
int main()
{
int n,k;
scanf("%d%d\n",&n,&k);
int hour,minute,second;
char s[5];
vector<car> ca(n);
for(int i=0;i<n;i++)
{
scanf("%s",ca[i].id);
scanf("%d:%d:%d",&hour,&minute,&second);
ca[i].time=hour*3600+minute*60+second;
scanf("%s",s);
if(strcmp(s,"in")==0) ca[i].status=1;//进
else ca[i].status=-1;//出
}
sort(ca.begin(),ca.end(),cmp1);
vector<car> valid(n);
map<string,int> mapp;
int maxtime=-1;
for(int i=0;i<n-1;i++)
{
if((strcmp(ca[i].id,ca[i+1].id)==0)&&(ca[i].status==1&&ca[i+1].status==-1))
{
valid.push_back(ca[i]);
valid.push_back(ca[i+1]);
mapp[ca[i].id]+=ca[i+1].time-ca[i].time;
if(maxtime<mapp[ca[i].id])
{
maxtime=mapp[ca[i].id];
}
}
}
sort(valid.begin(),valid.end(),cmp2);
vector<int> cnt(n); ///非常棒的统计
for(int i=0;i<valid.size();i++)
{
if(i==0) cnt[i]+=valid[i].status;
else cnt[i]=cnt[i-1]+valid[i].status;
}
for(int i=0;i<k;i++)
{
int h,m,s;
scanf("%d:%d:%d",&h,&m,&s);
int temptime=h*3600+m*60+s;
for(int j=0;j<valid.size();j++)
{
if(valid[j].time>temptime)
{
printf("%d\n",cnt[j-1]);
break;
}
}
}
for(map<string, int>::iterator it = mapp.begin(); it != mapp.end(); it++) {
if(it->second == maxtime)
printf("%s ", it->first.c_str());
}
printf("%02d:%02d:%02d", maxtime / 3600, (maxtime % 3600) / 60, maxtime % 60);
return 0;
}