到达时间

题目描述

菲奥娜每天都要上下班。 如果凑巧没有赶上高峰时段的交通,她的通勤时间是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);
}

猜你喜欢

转载自blog.csdn.net/looiezheng/article/details/81153384