洛谷 AT763【感雨時刻の整理】
题目描述
雨の降っていた時刻というのは、降水量と並んで重要です。今、ある 11 日の、雨が降っていた時刻に関するメモが見つかったので、これを整理して、雨の降っていた時刻を調べたいと思います。
整理は、以下の規則に従って行います。
- 感雨時間のメモから、その日 11 日の雨の降っていた時刻を時系列順に出す。日付を超えて降っている雨は、 00:0000:00 降り始めや 24:0024:00 降り終わりとして扱われるものとし、日付をまたぐようなメモは入力されない。
- 雨の降り始め・降り終わりはそれぞれ直前・直後の 55 分単位の時刻に丸める。例えば、 13:2313:23 に降り始めて 14:0114:01 にやんだ雨は、 13:2013:20 から 14:0514:05 まで降っていたということにする。
-
丸めた後の結果において、 22 つ以上のメモに書かれていた感雨時刻が重複した場合、 11 つの連続した雨とみなす。例えば、 11:0611:06 に降り始めて 11:2311:23 にやんだ雨、 11:2911:29 に降り始めて 12:0312:03 にやんだ雨、 11:4811:48 に降り始めて 12:1012:10 にやんだ雨の 33 つがあった場合、 11:0511:05 〜 11:2511:25 、 11:2511:25 〜 12:0512:05 、 11:4511:45 〜 12:1012:10 の 33 つの雨であるが、時間がかぶっているところをくっつけて 11:0511:05 から 12:1012:10 まで降っていた、 11 つの連続した雨ということにする。
メモの内容が入力される時、雨の降っていた時刻を、この規則に合致するよう整理して出力するプログラムを作成してください。
输入输出格式
输入格式:
输出格式:
雨が降っていた時刻を整理して、降り始めの時刻の早い順番に、降り始めた時刻と降り終わりの時刻をハイフンで区切って出力せよ。
その際、連続した 11 つの雨を 11 行に出力し、時刻の形式は入力と同じ形式を用いること。
また、出力の末尾には改行を入れること。
解题思路
第一步肯定先去翻译,剩下的题解里见(洛谷唯一一个提交的,好孤独)。
题解
1 #include<bits/stdc++.h> 2 using namespace std; 3 string sj[1000001]; 4 int main() 5 { 6 int n; 7 string s; 8 string x,y,x1,y1; 9 scanf("%d",&n); 10 for(int i=1;i<=n;i++) 11 { 12 cin>>s; 13 if(s[3]>='1'&&s[3]<='4')s[3]='0';//舍去 14 else if(s[3]>='6'&&s[3]<='9')s[3]='5';//舍去 15 if(s[8]>='1'&&s[8]<='4')s[8]='5';//向大的约 16 else if(s[8]>='6'&&s[8]<='9')//向大的约,进位 17 { 18 s[8]='0'; 19 if(s[7]=='5')//分钟要约 20 { 21 s[7]='0'; 22 if(s[6]=='9')//进位 23 { 24 s[6]='0'; 25 s[5]++; 26 } 27 else s[6]++; 28 } 29 else s[7]++; 30 } 31 sj[i]=s; 32 } 33 sort(sj+1,sj+1+n); 34 x=sj[1].substr(0,4); 35 y=sj[1].substr(5,4); 36 for(int i=2;i<=n;i++) 37 { 38 x1=sj[i].substr(0,4); 39 y1=sj[i].substr(5,4); 40 if(x1>=x&&x1<=y&&y1>=y){sj[i]=x+'-'+y1;x=x;y=y1;continue;} 41 else if(x1>=x&&x1<=y&&y1>=x&&y1<=y){sj[i]=x+'-'+y;continue;}//各种判断,理解靠自己 42 else{ 43 x=x1; 44 y=y1; 45 cout<<sj[i-1]<<endl; 46 } 47 } 48 cout<<sj[n]<<endl; 49 return 0; 50 }