题目分享:(洛谷P5707 上学迟到)
这道题出自洛谷题单---顺序结构中的一道题,这道题相对来说较为基础,考察了程序设计语言中最基础的顺序结构和选择结构,并不涉及很复杂的算法思想,但是需要理清思路,以下是笔者的一些想法和见解:
因为整个时间跨度是从今天的8:00到昨天的8:00,所以就涉及到了要考虑是否需要跨天,怎么判断是否需要跨天呢,可以利用给到的s和v算出这名同学需要走到学校的时间。注意,这里还有10分钟的垃圾分类时间,但是咱们先不管它。
先定义变量:
1.restMinute:该同学走到学校的时间
2.hour,minute:该同学走到学校需要花费的小时和分钟
3.h,m:最后的结果
以下是解题步骤:
(1)判断s和v能否整除,若能,则需要提前的时间restMinute = s/v;若不能,restMinute = s/v+1(不能迟到,所以要往前1分钟);
(2)得出的restMinute单位是分钟,所以我们要判断有多少个小时,多少分钟,那么就令hour为restMinute/60,则minute为restMinute%60;
(3)接下来我们要判断是否需要跨天,如果小时数hour大于7,则需要跨天,h = 24 - (hour-7) = 31 - hour;否则的话, h = 7 - hour;
(4)判断完小时后,就是分钟了,先把需要走到学校的时间减去,即 m = 60 - minute;
(5)最后我们要考虑那10分钟的垃圾分类时间啦,如果最后这个结果m大于10,那直接减去10就好了,但是如果小于10的话,就要往前一个小时跨了,此时需要分类讨论:
5.1 如果h不为0,即不是在00:xx的时候,直接让h-1就好了
5.2如果恰好h=0,即时间恰好在00:xx的时候,就要往前一天跨了,直接让h=23就好了
最后因为m<10,所以 m = 60-(10-m) =50 + m 。
(6)最后输出结果就行,别忘记不满两位的要补0
接下来放代码:
#include<iostream>
#include<cstdio>
using namespace std;
int h,m;
int main()
{
int s,v;
cin>>s>>v;
int restMinute;
if(s%v==0) restMinute = s/v;
else restMinute = s/v +1;//步骤(1)
int hour = restMinute/60;
int minute = restMinute%60;//步骤(2)
if(hour>7)
{
h = 31-hour;
}
else
{
h = 7-hour;
}//步骤(3)
int m = 60 -minute;//步骤(4)
if(m>=10)
{
m = m-10;
}//步骤(5)
else
{
m = 50+m;
if(h>0)
{
h-=1;
}//步骤(5)---5.1
else
{
h = 23;
}//步骤(5)---5.2
}
if(h<10&&m>=10)
{
printf("0%d:%d",h,m);
}
else if(h<10&&m<10)
{
printf("0%d:0%d",h,m);
}
else if(h>=10&&m<10)
{
printf("%d:0%d",h,m);
}
else
{
printf("%d:%d",h,m);
}//步骤(6)
return 0;
}
以上是个人的一些分享,由于个人是初学者小白,如果有错误,请大家及时纠正。
1680

被折叠的 条评论
为什么被折叠?



