P11002 [蓝桥杯 2024 省 Python B] 神奇闹钟Link: https://www.luogu.com.cn/problem/P11002题目描述小蓝发现了一个神奇的闹钟从纪元时间1970 19701970年1 11月1 11日00 : 00 : 00 00:00:0000:00:00开始每经过x xx分钟这个闹钟便会触发一次闹铃纪元时间也会响铃。这引起了小蓝的兴趣他想要好好研究下这个闹钟。对于给出的任意一个格式为yyyy-MM-dd HH:mm:ss的时间小蓝想要知道在这个时间点之前包含这个时间点的最近的一次闹铃时间是哪个时间注意你不必考虑时区问题。输入格式输入的第一行包含一个整数T TT表示每次输入包含T TT组数据。接下来依次描述T TT组数据。每组数据一行包含一个时间格式为yyyy-MM-dd HH:mm:ss和一个整数x xx其中x xx表示闹铃时间间隔单位为分钟。输出格式输出T TT行每行包含一个时间格式为yyyy-MM-dd HH:mm:ss依次表示每组数据的答案。输入输出样例 #1输入 #12 2016-09-07 18:24:33 10 2037-01-05 01:40:43 30输出 #12016-09-07 18:20:00 2037-01-05 01:30:00说明/提示对于所有评测用例1 ≤ T ≤ 10 1 ≤ x ≤ 1000 1 \le T \le 101 \le x \le 10001≤T≤101≤x≤1000保证所有的时间格式都是合法的。Solution1. 题意一个闹钟从1970 19701970年1 11月1 11日00 : 00 : 00 00:00:0000:00:00每隔固定的时间响铃一次输入一个时间求最近一次响铃是什么时候。2. 分析题目既然都说 Python 了那么这里就用 Python 求解。处理这种类型的日期问题可以利用 Python 自带的 datetime 模块求解。具体步骤如下求出给定日期与1970 19701970年1 11月1 11日00 : 00 : 00 00:00:0000:00:00之间相差的秒数秒数对60 6060整除求出分钟数分钟数对间隔的分钟数也就是题中的x xx整除求出经历了多少个周期周期数乘以x xx然后作为成员函数timedelta的参数加在1970 19701970年1 11月1 11日00 : 00 : 00 00:00:0000:00:00上代码表示为datetime(1970,1,1,0,0,0) timedelta(minutes 周期数乘以x)值得注意的是Python 的 datetime 对象如果直接用 print 函数输出会自动被转化为yyyy-mm-dd hh:mm:ss的格式因此无需再进行字符串格式化的操作。3. 代码(1) Pythonfromdatetimeimport*tint(input())foriinrange(t):ymd,hms,deltainput().split()year,month,dayymd.split(-)hour,minute,secondhms.split(:)currentdatetime(int(year),int(month),int(day),int(hour),int(minute),int(second))deltaint(delta)periodsint((current-datetime(1970,1,1,0,0,0)).total_seconds())//60//delta resultdatetime(1970,1,1,0,0,0)timedelta(minutesperiods*delta)print(result)(2) C#C# 也可以使用 DateTime 对象求解此题唯一需要注意的是输出要表示成题目的格式。usingSystem;publicclassP11002{staticvoidMain(){inttint.Parse(Console.ReadLine());for(inti0;it;i){string[]inputConsole.ReadLine().Split();string[]ymdinput[0].Split(-);string[]hmsinput[1].Split(:);intdeltaint.Parse(input[2]);DateTimecurrentnewDateTime(int.Parse(ymd[0]),int.Parse(ymd[1]),int.Parse(ymd[2]),int.Parse(hms[0]),int.Parse(hms[1]),int.Parse(hms[2]));DateTimeepochnewDateTime(1970,1,1,0,0,0,DateTimeKind.Utc);longperiods(long)((current-epoch).TotalSeconds)/60/delta;DateTimeresultepoch.AddMinutes(periods*delta);Console.WriteLine(result.ToString(yyyy-MM-dd HH:mm:ss));}}}4. 轶事在 Visual Studio 2022 的拖拽式操作的加持下C# 设计带有 GUI 的窗体应用程序相较于 Python 和 Java变得非常方便从 C# 9.0 起C# 的程序可以不定义主函数和主类直接像 Python 一样罗列几个顶级语句就可以执行。