T292112 [传智杯 #5 练习赛] 时钟

209 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

[传智杯 #5 练习赛] 时钟

题目描述

你有一个电子钟,可以显示 0:0023:59 之间的所有时间,以数字的形式显示。其中小时是 023(0 时会显示一个 0,而 1 到 9 时不会显示前导 0),分钟是 0059(0 到 9 分都会显示前导 0)。任何时刻,电子钟都会显示三个或者四个 0099 的数字。如果在某时刻,这些数字依次组成了一个等差数列,则这个时刻被称为“好时刻”。

你感觉很无聊,从 0:00 时刻开始盯着这个电子钟。一共盯了 xx 分钟。请问整个过程中,"好时刻"来临了多少次(算上开头和结尾)?

输入格式

一个不超过 10910^9 的非负整数。

输出格式

请输出"好时刻"来临了多少次?

样例 #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:模拟题,简单~