题目描述:
题目解读:
数学上的遛狗问题。
大意就是需要遛狗,一天至少两次,每次至少120分钟,题中所给的时间轴是从0-1440分钟,表示一整天。
然后它的主人正在不断接收信息(在工作),在信息间隔可以去遛狗。问遛狗是否遛了足够的时间和次数。
输入 消息数n 和 具体的发送消息的时间
输出 是否至少遛狗两次且每次至少120分钟,满足则输出YES,否则输出NO
解题思路:
给定了消息的数量和发送消息的时间。
需要遍历每两个消息之间的间隔是否>120,大于的话,具体大于多少,因为足够大的话可以连续遛狗。比如时间间隔≥240,就可以连续遛狗,那这一个时间间隔即可完成遛狗任务。
可以设置一个变量(代码中的flag)用来记录具体遛狗次数。
首先,输入里不包含起始时间0和最大时间1440,但是计算时间间隔时需要考虑第一次来信息的时间和0之间的时间间隔是否可以遛狗,以及最后一次来信息的时间和1440之间的时间间隔是否可以溜狗。所以我们需要额外将这两个时间加入到数组中。
然后输入每个消息时间,并判断其和前一个时间之间的时间间隔是否可以遛狗(即是否大于120)以及遛狗的次数(是120的多少整数倍)。
1440和最后一次消息时间之间的时间间隔无法写在1~n中的遍历中,所以要额外计算。
遍历完所有时间之后,判断满足时间条件的遛狗次数即可。大于2返回YES,小于2返回NO。
代码实现:
#include <stdio.h>
#define MAX 100 void Solve() {int n;int flag = 0;int num[MAX];scanf("%d", &n);num[0] = 0; //起始时间num[n + 1] = 1440; //最大时间for (int i = 1; i <= n; i++) {scanf("%d", &num[i]);flag += (num[i] - num[i - 1]) / 120;}flag += (num[n + 1] - num[n]) /120; //特殊情况,1440-最后一次信息if (flag > 1) {printf("YES\n");}else{printf("NO\n");}return;
}int main() {int t;scanf("%d", &t);while (t--) Solve();return 0;
}
遇到的错误:
判断时间间隔是否大于120和间隔为120的多少倍,只需要用一个除法(时间间隔/120)即可实现。因为时间间隔<120时,时间间隔/120直接取整为0。
不用额外先进行判断再计算。