专栏文章
UVA1529 题解
UVA1529题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minnwsgw
- 此快照首次捕获于
- 2025/12/02 05:29 3 个月前
- 此快照最后确认于
- 2025/12/02 05:29 3 个月前
UVA1529 时钟 题解
题目大意
给定一个12小时制的时钟,计算在指定时间段内分针越过时针的次数。
输入格式
多组数据,每组数据包含四个整数:
- :起始小时
- :起始分钟
- :结束小时
- :结束分钟
输出格式
按要求输出表格,包含初始时间、结束时间和超越次数。
解题思路
1. 相对运动分析
- 分针角速度:
- 时针角速度:
- 相对角速度:
2. 相遇周期计算
分针相对于时针每多走一圈(360°)就超越一次,超越周期为:
3. 计算方法
将时间统一转换为分钟:
- 起始时间:
- 结束时间:
如果,说明经过了12点,需要给加上720分钟。
超越次数计算公式:
其中用于处理边界情况(题目保证不会正好在超越时刻)。
算法步骤
- 读取多组输入数据
- 将时间转换为分钟表示
- 处理经过12点的情况
- 计算超越次数
- 按格式输出结果
复杂度分析
- 时间复杂度: 每组数据
- 空间复杂度:
代码实现
CPP#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点的情况
-
边界处理使用微小偏移量避免整数舍入问题
后话
本蒟蒻第一次写题解,写的不是很好,请见谅。望管理员通过。并且在写完本文后,使用了DeepSeek进行润色,一切后果由我承担。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...