开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
[传智杯 #5 练习赛] 时钟
题目描述
你有一个电子钟,可以显示 0:00 到 23:59 之间的所有时间,以数字的形式显示。其中小时是 0 到 23(0 时会显示一个 0,而 1 到 9 时不会显示前导 0),分钟是 00 到 59(0 到 9 分都会显示前导 0)。任何时刻,电子钟都会显示三个或者四个 到 的数字。如果在某时刻,这些数字依次组成了一个等差数列,则这个时刻被称为“好时刻”。
你感觉很无聊,从 0:00 时刻开始盯着这个电子钟。一共盯了 分钟。请问整个过程中,"好时刻"来临了多少次(算上开头和结尾)?
输入格式
一个不超过 的非负整数。
输出格式
请输出"好时刻"来临了多少次?
样例 #1
样例输入 #1
120
样例输出 #1
10
样例 #2
样例输入 #2
2880
样例输出 #2
79
样例 #3
样例输入 #3
987654321
样例输出 #3
26748975
提示
【样例解释】
你观察了 2 个小时,其中这些“好时刻”来临了:
0:00
0:12
0:24
0:36
0:48
1:11
1:23
1:35
1:47
1:59
一共是 10 个。
题目分析:
- 1.首先按照模拟的思路的话,我们毫无疑问的会发现一些问题
- 首先就是按照输入的n不断的循环判断,会非常的耗时,可能会爆
- 再就是一天是1440分钟,可是1440在样例中只是一个比较小的例子,所以就是说,很多操作是重复的
- 2.那么思路就清晰了,我们需要先将一天的分钟都记录一下是不是符合要求的数
- 3.然后用一个计数器记录一下一天的数,对于n取模1440(一天的分钟数),再循环判断
- 4.统计输出
代码展示
#include<iostream>
#include<string>
using namespace std;
const int N = 1440;
bool st[N];//一天的分钟数的计数器
bool check(string x) {
int d = (x[1] - '0') - (x[0] - '0');
for (int i = 1; i < x.size() - 1; i++) {
if (((x[i + 1] - '0') - (x[i] - '0')) != d)
return false;
}
return true;
}
int main()
{
int n;
cin >> n;
int count = 0;
for (int i = 0; i < N; i++) {
int h = i / 60;
int m = i % 60;
string s;
//加上小时
if (h >= 10) {
s += (h / 10 + '0');
s += (h % 10 + '0');
}
else {
s += (h + '0');
}
//加上分钟
if (m >= 10) {
s += (m / 10 + '0');
s += (m % 10 + '0');
}
else {
s += '0';
s += (m + '0');
}
if (check(s)) {
st[i] = true;
count++;
}
}
int res = 0;
res = (n / 1440) * count;
count = n % 1440 + 1;
for (int i = 0; i < count; i++)
if (st[i])res++;
cout << res;
return 0;
}
PS:模拟题,简单~