#A0. 时雨

时雨

题目描述:

好雨知时节,当春乃发生。

降雨记录是重要的天气预报信息,已知一天中n条降雨记录信息,每条信息包括一次降雨的开始时间和结束时间。

  • 降雨记录最早为00:00,最多到24:00
  • 降雨记录通常并不准确,有时我们认为降雨已经停止,但实际降雨仍在继续。因此,降雨记录的开始时间需要往前算至多5分钟,结束时间需要往后算至多5分钟,两个时间的分钟数必须是5的倍数。具体而言,13:23-14:01的降雨记录我们认为[降雨时间]为13:20-14:05,21:00-21:30的记录我们会认为[降雨时间]为21:00-21:30
  • 有时降雨时间会重叠,比如[降雨时间]为9:30-10:00和9:45-11:00的两段,可以视为9:30-11:00一直在下雨。

现在给出若干降雨记录,请计算[降雨时间]并将下雨的时间段依次输出。

输入格式:

第一行一个整数n表示降雨记录数目

接下来n行每行两个整数s,t表示降雨记录的开始和结束时间,分别用4位数字表示,可能存在前导0其中前两位为小时,后两位为分钟。保证是合法的时间点。

输出格式:

按时间顺序输每个降雨的时间段,格式同输入

样例:

样例 #1

样例输入 #1

4
1148-1210
1323-1401
1106-1123
1129-1203

样例输出 #1

1105-1210
1320-1405

样例 #2

样例输入 #2

6
1157-1306
1159-1307
1158-1259
1230-1240
1157-1306
1315-1317

样例输出 #2

1155-1310
1315-1320

样例 #3

样例输入 #3

1
0000-2400

样例输出 #2

0000-2400

20%的数据n=1

40%的数据按时间顺序给出且各时间段没有交集

100%的数据1<=n<=1000,时间保证合法

#include <bits/stdc++.h>
using namespace std;
struct node{
    int start,end;
}a[10005];
int n;
bool cmp(node a,node b){
    if(a.start==b.start){
        return a.end<b.end;
    }
    else return a.start<b.start;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        scanf("%d-%d",&a[i].start,&a[i].end);
        if(a[i].start%5!=0)a[i].start-=a[i].start%5;
        if(a[i].end%5!=0)a[i].end+=5-a[i].end%5;
        //1958 1960
        if(a[i].end%100==60)a[i].end = (a[i].end/100+1)*100;
    }
    for(int i=1;i<n;i++){
        for(int j=1;j<=n-i;j++){
            if(a[j].start>a[j+1].start){
                swap(a[j],a[j+1]);
            }
            else if(a[j].start==a[j+1].start && a[j].end>a[j+1].end){
                swap(a[j],a[j+1]);
            }
        }
    }
    int start = a[1].start,end = a[1].end;
    for(int i=2;i<=n;i++){
        if(a[i].start>end){
            printf("%04d-%04d\n",start,end);
            start = a[i].start;
            end = a[i].end;
        }
        else{
            end = max(end,a[i].end);
        }
    }
    printf("%04d-%04d\n",start,end);
    return 0;
}