这个题的意思有点没说清楚,不知道最频繁指的什么,后来队友指点,直接开一个1440大的数组存每一分钟的状态,然后找出最大的次数,然后第一次出现这样的次数的一段。为了统计,在最后补了一个-1;
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<sstream>
using namespace std;
string format(int n)
{
string ans="";
stringstream ss;
ss<<n;
ss>>ans;
if(n==0) ans="00";
else if(n<10) ans="0"+ans;
return ans;
}
int main()
{
int T;
cin>>T;
int n;
while(cin>>n)
{
int p[1441]={0};
int shour,smin,ehour,emin;
for(int i=0;i<n;i++)
{scanf("%d:%d %d:%d",&shour,&smin,&ehour,&emin);
for(int i=shour*60+smin;i<=ehour*60+emin;i++)
p[i]++;
}
int max=0;
for(int i=0;i<1440;i++)
if(p[i]>max) max=p[i];
p[1440]=-1; //为了统计用
int begin=0,end=0;
for(int i=0;i<1441;i++)
if(p[i]==max)
{
if(i==0) {begin=0; break;}
if(i>0&&p[i-1]!=max)
{
begin=i; break;
}
}
for(int i=0;i<1440;i++)
if(p[i]==max&&p[i+1]!=max)
{
end=i;
break;
}
cout<<format(begin/60)<<":"<<format(begin%60)<<" "<<format(end/60)<<":"<<format(end%60)<<endl;
}
}