编程语言
首页 > 编程语言> > 算法题【上学迟到】

算法题【上学迟到】

作者:互联网

# 题目描述
yyy 的学校要求早上 8 点前到达。学校到 yyy 的家一共有 s(s\le 10000)s(s≤10000) 米,而 yyy 可以以 v(v<10000)v(v<10000) 米每分钟的速度匀速走到学校。此外在上学路上它还要额外花 10 分钟时间进行垃圾分类。请问为了避免迟到 yyy 最晚什么时候出门?输出 HH:MM 的时间格式,不足两位时补零。由于路途遥远, yyy 可能不得不提前一天出发,不过不可能提前超过一天。

#输入格式
两个正整数 s,v,意思已经在题目中给定。

# 输出格式
hh:mm 表示最晚离开家的时间(时:分,必须输出两位,不足两位前面补0)

## 输入输出样例
### 输入
100 99

### 输出
07:48

# 题目分析
## _ 首先我们要明白题目中的几个要点:_

1.要明白迟到哪怕一秒钟也算是迟到,所以当我们将s和v规定成int型时,我们就要考虑s能不能将v整除从而得到所用时间t,这里就产生了代码中的第一个分类: s%v=0与s%v!=0;

2.在第一点的基础上,不要忘了,最终的t中还有一部分是垃圾分类的时间;

3.接下来就到了主要部分,关于时间,其实我相信大家心中都有一个最基本的思路:从8点开始往回逆推。但是题目中又提到了时间可能会很长,以至于需要提前甚至一天,但又不可能超过一天,这里就出现了代码的第二个分类:出发时间在今天与出发时间在昨天;

4.一旦出现时间问题,我们首先要考虑的就是到底是12小时制还是24小时制,其实到这里的时候我也有一点的小纠结,因为我觉得题目中好像并没有给出特别明显的要求,但我根据题目对输出的要求做出了判断(仅代表个人思考,如有其他想法,欢迎评论):由于输出必须是两位,所以我按照24小时制来进行了计算,最终也达到了AC的目的。当然这也提醒了我们输出的时候要注意格式。

## 其次来盘点一下具体的时间逆推方法:
如果s%v=0的话,最终的t既是s/v再加上垃圾分类的十分钟;如果s%v!=0的话,就要特别注意了,这里是一个坑点,此时最终的时间是s/v加上垃圾分类的十分钟再加上一分钟,这里的一分钟是为了保证不迟到s%v的那几秒钟; 接下来就要关注一下时间的长短:有没有超过一天?如果最终的t比8小时也即480分钟短的话,出发时间就在今天,将t换算成a小时b分钟,再用8点0分减去a小时b分钟,这里再说的更加详细一点就是:如果b=0,则hh=8-a,mm=0;如果b!=0,则hh=7-a(因为要借出一个小时来减去余下的分钟),mm=60-b。如果最终的t比480分钟长的话,出发时间就在昨天,详细的方法如下:如果b=0,则hh=24-(a-8)(因为要算出减去今天的8个小时后,还要再往前推到几点),mm=0;如果b!=0,则hh=23-(a-8)(因为要借出一个小时来减去余下的分钟),mm=60-b。

以上就是详细的时间逆推方法。

#代码如下
 

#include<stdio.h>
int main()
{
    int s,v;
    int hh,mm;
    scanf("%d %d",&s,&v);
    int t;
    t=s/v;
    if(s%v==0)
    {
        t+=10;
    }
    else
    {
        t+=11;
    }
    
    if(t%60==0)
    {
        if(t<=480)
        {
            hh=8-(t/60);
            mm=0;
        }
        else
        {
            hh=24-(t/60-8);
            mm=0;
        }
    }
    else
    {
        if(t<=480)
        {
            hh=7-(t/60);
            mm=60-t%60;
        }
        else
        {
            hh=23-(t/60-8);
            mm=60-(t%60);
        }
    }
    printf("%02d:%02d",hh,mm);
    return 0;
}

标签:题目,mm,hh,迟到,int,算法,时间,上学,s%
来源: https://blog.csdn.net/liuyitingliuyihe/article/details/121843800