题目描述
小蓝发现了一个神奇的闹钟,从纪元时间(1970 年 1 月 1 日 00:00:00 )开始,每经过 x 分钟,这个闹钟便会触发一次闹铃(纪元时间也会响铃)。这引起了小蓝的兴趣,他想要好好研究下这个闹钟。
对于给出的任意一个格式为 yyyy-MM-dd HH:mm:ss 的时间,小蓝想要知道在这个时间点之前(包含这个时间点)的最近的一次闹铃时间是哪个时间?
注意,你不必考虑时区问题。
输入格式
输入的第一行包含一个整数 T,表示每次输入包含 T 组数据。
接下来依次描述 T 组数据。
每组数据一行,包含一个时间(格式为 yyyy-MM-dd HH:mm:ss )和一个整数 x ,其中 x 表示闹铃时间间隔(单位为分钟)。
输出格式
输出 T 行,每行包含一个时间(格式为 yyyy-MM-dd HH:mm:ss ),依次表示每组数据的答案。
样例输入
2 2016-09-07 18:24:33 10 2037-01-05 01:40:43 30
样例输出
2016-09-07 18:20:00 2037-01-05 01:30:00
提示
【评测用例规模与约定】
对于所有评测用例,1 ≤ T ≤ 10,1 ≤ x ≤ 1000,保证所有的时间格式都是合法的。
代码
from datetime import datetime, timedelta
def find_closest_ring_time(given_time_str, interval_minutes):
# 将时间字符串转换为 datetime 对象
given_time = datetime.strptime(given_time_str, '%Y-%m-%d %H:%M:%S')
# 将间隔分钟转换为时间间隔
interval = timedelta(minutes=interval_minutes)
# 从纪元时间开始,计算最接近但不晚于给定时间的闹铃时间
start_time = datetime(1970, 1, 1, 0, 0, 0)
closest_ring_time = start_time
# 循环直到找到最接近但不晚于给定时间的闹铃时间
while closest_ring_time < given_time:
closest_ring_time += interval
# 如果计算出的闹铃时间晚于给定时间,需要减去一个间隔
if closest_ring_time > given_time:
closest_ring_time -= interval
return closest_ring_time.strftime('%Y-%m-%d %H:%M:%S')
# 读取输入数据组数 T
T = int(input())
# 循环读取 T 组数据
results = []
for _ in range(T):
# 输入时间字符串和间隔分钟数
input_data = input().strip()
time_str, interval_str = input_data.rsplit(maxsplit=1) # 用空格分割字符串,取最后一个元素作为间隔分钟数
try:
# 将间隔分钟数转换为整数
interval_minutes = int(interval_str)
# 计算并存储结果
results.append(find_closest_ring_time(time_str, interval_minutes))
except ValueError:
print("间隔分钟数必须为整数。")
# 输出所有结果
for result in results:
print(result)