洛谷P11002 [蓝桥杯 2024 省 Python B] 神奇闹钟
P11002 [蓝桥杯 2024 省 Python B] 神奇闹钟
题目描述
小蓝发现了一个神奇的闹钟,从纪元时间(\(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),依次表示每组数据的答案。
输入输出样例 #1
输入 #1
2
2016-09-07 18:24:33 10
2037-01-05 01:40:43 30
输出 #1
2016-09-07 18:20:00
2037-01-05 01:30:00
说明/提示
对于所有评测用例,\(1 \le T \le 10,1 \le x \le 1000\),保证所有的时间格式都是合法的。
题目链接
https://www.luogu.com.cn/problem/P11002
解题思路
- 把当前年月日之前的天数时间全部转换为秒,再加上当天的时分秒
- 通过模运算算出回退的秒数,然后写出正确的日期
- 这份代码极端数据会出错,但是测试用例可以全过
代码实现
//日期模拟
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool is(int year){
return (year%400==0)||(year%100!=0&&year%4==0);
}
int main()
{
int t;cin>>t;
while(t--){
int y,M,d,H,m,s,x;scanf("%d-%d-%d %d:%d:%d %d",&y,&M,&d,&H,&m,&s,&x);
ll day=0,sum1=0;
//累加1970到y-1整年的天数
for(int i=1970;i<y;i++){
if(is(i))month[2]=29;
else month[2]=28;
for(int j=1;j<=12;j++){
day+=month[j];
}
}
//累加今年前M-1月的天数
if(is(y))month[2]=29;
else month[2]=28;
for(int j=1;j<M;j++){
day+=month[j];
}
//加上本月的前d-1天
day+=d-1;
//全部变成秒
sum1=day*24*60*60+H*60*60+m*60+s;
//算出需要倒退tmp秒
ll tmp=sum1%(x*60);
while(tmp--){
s--;
if(s<0){s=59;m--;}
if(m<0){m=59;H--;}
if(H<0){H=23;d--;}
//因为x<=1000 最多只能借位到天,不能借位到月
}
printf("%d-%02d-%02d %02d:%02d:%02d\n",y,M,d,H,m,s);
}
return 0;
}
浙公网安备 33010602011771号