UVA1529 题解
UVA1529 时钟 题解
原题传送门
题目大意
给定一个12小时制的时钟,计算在指定时间段内分针越过时针的次数。
输入格式
多组数据,每组数据包含四个整数:
输出格式
按要求输出表格,包含初始时间、结束时间和超越次数。
解题思路
1. 相对运动分析
- 分针角速度:
360°/60\\text{min} = 6°/min - 时针角速度:
360°/720\\text{min} = 0.5°/min - 相对角速度:
6 - 0.5 = 5.5°/min
2. 相遇周期计算
分针相对于时针每多走一圈(360°)就超越一次,超越周期为:
3. 计算方法
将时间统一转换为分钟:
- 起始时间:
start = h_1 \\times 60 + m_1 - 结束时间:
end = h_2 \\times 60 + m_2
如果
超越次数计算公式:
其中
算法步骤
- 读取多组输入数据
- 将时间转换为分钟表示
- 处理经过12点的情况
- 计算超越次数
- 按格式输出结果
复杂度分析
- 时间复杂度:
O(1) 每组数据 - 空间复杂度:
O(1)
代码实现
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
int h1, m1, h2, m2;
const double cycle = 720.0 / 11.0;
printf("Program 3 by team X\n");
printf("Initial time Final time Passes\n");
while(scanf("%d%d%d%d", &h1, &m1, &h2, &m2) != EOF){
int start = h1 * 60 + m1;
int end = h2 * 60 + m2;
if(end < start) end += 720;
int passes = (int)((end - 0.0001) / cycle)
- (int)((start - 0.0001) / cycle);
printf(" %02d:%02d %02d:%02d %2d\n",
h1, m1, h2, m2, passes);
}
printf("End of program 3 by team X\n");
return 0;
}
注意事项
-
输出格式必须严格符合题目要求
-
时间需要格式化为两位数字(前导零)
-
注意处理经过中午12点的情况
-
边界处理使用微小偏移量避免整数舍入问题
::::info[后话] 本蒟蒻第一次写题解,写的不是很好,请见谅。望管理员通过。并且在写完本文后,使用了DeepSeek进行润色,一切后果由我承担。 ::::