这个题的意思有点没说清楚,不知道最频繁指的什么,后来队友指点,直接开一个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; } }