懒惰的松雅——湖南大学程序设计作业

前言

通过之前发的一篇博客,我结识了很多大佬。我自己心里面清楚,现在我写的东西对于很多大佬来说不过是小菜一碟,但是呢,我还是希望能够继续写下去,一来巩固我自己的知识,二来见证我的成长(每个人都是一步一步走上去的嘛),最后呢,也是最重要的,能够认识很多朋友,能够有更大的交流空间,我想,这是一个优秀的程序员所必要的条件。

问题回顾

现在转入正题,我们看到题目,又是松雅,看来小明没能上大学,我们的大学伙伴变成了松雅了。我们来看看题

在这里插入图片描述
*松雅喜欢睡懒觉(巧了,我也喜欢),有一天,她必须在 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的麻烦。

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值