#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;
}