前言
通过之前发的一篇博客,我结识了很多大佬。我自己心里面清楚,现在我写的东西对于很多大佬来说不过是小菜一碟,但是呢,我还是希望能够继续写下去,一来巩固我自己的知识,二来见证我的成长(每个人都是一步一步走上去的嘛),最后呢,也是最重要的,能够认识很多朋友,能够有更大的交流空间,我想,这是一个优秀的程序员所必要的条件。
问题回顾
现在转入正题,我们看到题目,又是松雅,看来小明没能上大学,我们的大学伙伴变成了松雅了。我们来看看题
*松雅喜欢睡懒觉(巧了,我也喜欢),有一天,她必须在 hh:mm 的时间起来去跟她的合伙人讨论新开旅馆的事情。然而,她讨厌醒来,她希望在一个幸运时间设置一个闹钟以减少痛苦,这样她可以反复按“小睡一会儿”按钮,该按钮每次可延迟 x 分钟,直到 hh:mm 这个时间醒来,她想知道最少需要按多少次这个按钮。
如果一个时间的数字中包含’7’,则她认为是幸运时间,例如:13:07和17:20是幸运的,而00:48和21:34不是。
注意,设置闹钟的时间与醒来的时间不一定在同一天,输入保证对每个醒来时间都有一个幸运时间。
正常地,可以找到一个最小的非负整数 y 使得在时间 hh:mm 之前的 yx 分钟是一个幸运时间,即包含数字’7’。
时间采用24小时制,因此在23:59之后是00:00。
【输入形式】
输入的第一行包含一个正整数 x (1 ≤ x ≤ 60)。
第二行包含两个整数,分别代表小时与分钟( hh:mm )。
【输出形式】
输出一行一个整数,表示松雅需要按“小睡一会儿”按钮的最小次数。
【样例输入1】
3
11 23
【样例输出1】
2
【样例输入2】
5
1 7
【样例输出2】
0
【样例说明】
在第一个样例中,她需要在11:23分醒来,她可以设置闹钟的幸运时间为11:17,因此她需要在11:17分和11:20按两次按钮。
在第二个样例中,01:07就是幸运时间。
思路分析
让我们来理一理思路,
首先呢,松雅喜欢幸运时间,所以她第一次醒来的时间都会是幸运时间(定了幸运时间就能起床?!对我来说是不存在的。。。)也就是含有数字7。这里有一个小细节,题上也给出了,如果最终起床的时间含有数字7,那么松雅就不会赖床,她会立即起床,也就是没有按“小睡一会儿”,输出即为“0”。
幸运时间到
int x,h,m;
cin>>x>>h>>m;
if(h%10==7||m%10==7)//因为小时和分钟的第一位都不可能为7,所以只需要判断第二位
cout<<'0';
另外还有一个很重要的细节,即题中所给的
“注意,设置闹钟的时间与醒来的时间不一定在同一天”
这意味着在后续的运算中,我们很可能会将前一天的时间考虑进来
解决方法
这题很香的地方就在于只可能个位数会出现7,我们抓住这个特点来解题。
如果我们将小时转化成分钟,我们会发现分钟上的个位数并不会改变,每小时增加60,个位数不变,那我们大可以把小时全部转化为分钟,然后判断这个数的个位是不是7就行了。
另外还得考虑小时上的7。小时上有7的就只有7和17。也就是7:00~7:59;17:00 ~17:59,换算成分钟就是420 ~479;1020 ~1079。也就是说当分钟数到这个数段的时候我们就不用继续往下算了,这个分钟数就是幸运时间。
int sum;//记录分钟数
sum=60*h+m;
int count=0;//记录“小睡一会儿”次数
for(;;){
if((sum-x)<=0)//考虑上前一天
sum+=1440;
sum-=x;
count++;
if(sum%10==7||(sum>=420&&sum<=479)||(sum>=1020&&sum<=1079))
break;
}
注意,这里要判断sum减去x后会不会小于0,如果小于0就说明到前一天去了,所以我们要加上一天的分钟数1440。
总结
这题应该算是比较简单,我写这个的目的呢是想强调一下编程中的细节,在编程中出了问题,如果大方向是对的,那么很可能就是细节方面的问题。如果选择忽略细节的话,那么你自己无法保证以后会不会再次遇到同样的问题,最后还是得花时间解决,有时候一个很庞大的程序,正是因为一些小小的细节造成了整个程序的崩盘,而想找到那个出错的细节是很费时间的,所以我认为,在编程之前就应当仔细思考这些小细节方面的问题,免去之后找bug的麻烦。