题目描述
菲奥娜每天都要上下班。 如果凑巧没有赶上高峰时段的交通,她的通勤时间是2小时。但是,实际上经常会碰上高峰时段。 具体而言,高峰时段的交通从07:00(早上7点)开始到上午10:00(上午10点),下午15:00(下午3点)至19:00(晚上7点)。 如果碰上了高峰时段的交通,她的速度会降低一半。
她的离开时间一定是在整小时(XX:00),或者相对整点超过20分钟(在XX:20)又或过去40分钟(XX:40)的时间点。
鉴于菲奥娜的出发时间,她什么时候到达工作岗位?
输入输出格式
输入格式:
输入将是一行,包含HH:MM形式的表达式,HH是0~23的整数表示小时,MM是(00,20,40)其中之一的可能的分钟时间
输出格式:
输出也是一行,HH:MM表示菲奥娜的到达时间
输入输出样例
输入样例#1:
05:00
输出样例#1:
07:00
输入样例#2:
07:00
输出样例#2:
10:30
说明
样例1:说明:菲奥娜没有遇到任何高峰时段的交通,凌晨5点离开,她准时到达早上7点
样例2:菲奥娜在高峰时段的交通中驾驶3小时,但只能在平常一半的速度下尽可能地行驶。 在最后的30分钟(0.5小时)内,她在非高峰时段开车 交通,速度正常。
解题思路
将菲奥娜可能遇到的情况分成4个等价类:
Case 1. 没有遇到高峰;Case 2.从平常速度开始到高峰结束;Case 3从平常开始到高峰再到平常结束;Case 4从高峰开始到平常结束。
由于时间是按小时:分钟形式输入的,不方便比较,可以统一转化成分钟来计算,便于对上述情况分类。
另外注意时间跨0点的问题。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int h,m,t;
cin>>h;
getchar();
cin>>m;
t=h*60+m;
int rt=0;
if(t+120<=420) //Case 1
{
rt = t+120;
}
else if((t<=420) )//Case 2
{
int temp=420-t;
int moretime=(120-temp);
rt = t+120+moretime;
if(rt > 600) //Case 3
{
rt -= (rt-600)/2;
}
}
else if(t>420 and t<600) //Case 4
{
rt = 600+(120-(600-t)/2);
}
else if(t+120<=900) //Case 1
{
rt = t+120;
}
else if((t<=900) ) //Case 2
{
int temp=900-t;
int moretime=(120-temp);
rt = t+120+moretime;
if(rt > 1140) //Case 3
{
rt -= (rt-1140)/2;
}
}
else if(t>900 and t<1140) //Case 4
{
rt = 1140+(120-(1140-t)/2);
}
else //Case 1
{
rt = t+120;
}
rt =rt%1440; //解决跨0点
printf("%02d:%02d",rt/60, rt%60);
}