专栏文章

UVA1529 题解

UVA1529题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minnwsgw
此快照首次捕获于
2025/12/02 05:29
3 个月前
此快照最后确认于
2025/12/02 05:29
3 个月前
查看原文

UVA1529 时钟 题解

题目大意

给定一个12小时制的时钟,计算在指定时间段内分针越过时针的次数。

输入格式

多组数据,每组数据包含四个整数:
  • hi,1h_{i,1}:起始小时
  • mi,1m_{i,1}:起始分钟
  • hi,2h_{i,2}:结束小时
  • mi,2m_{i,2}:结束分钟

输出格式

按要求输出表格,包含初始时间、结束时间和超越次数。

解题思路

1. 相对运动分析

  • 分针角速度:360°/60textmin=6°/min360°/60\\text{min} = 6°/min
  • 时针角速度:360°/720textmin=0.5°/min360°/720\\text{min} = 0.5°/min
  • 相对角速度:60.5=5.5°/min6 - 0.5 = 5.5°/min

2. 相遇周期计算

分针相对于时针每多走一圈(360°)就超越一次,超越周期为: T=frac360°5.5°/min=frac72011approx65.454545text分钟T = \\frac{360°}{5.5°/min} = \\frac{720}{11} \\approx 65.454545\\text{分钟}

3. 计算方法

将时间统一转换为分钟:
  • 起始时间:start=h1times60+m1start = h_1 \\times 60 + m_1
  • 结束时间:end=h2times60+m2end = h_2 \\times 60 + m_2
如果end<startend < start,说明经过了12点,需要给endend加上720分钟。
超越次数计算公式: passes=leftlfloorfracendepsilonTrightrfloorleftlfloorfracstartepsilonTrightrfloorpasses = \\left\\lfloor\\frac{end - \\epsilon}{T}\\right\\rfloor - \\left\\lfloor\\frac{start - \\epsilon}{T}\\right\\rfloor
其中epsilon=0.0001\\epsilon = 0.0001用于处理边界情况(题目保证不会正好在超越时刻)。

算法步骤

  1. 读取多组输入数据
  2. 将时间转换为分钟表示
  3. 处理经过12点的情况
  4. 计算超越次数
  5. 按格式输出结果

复杂度分析

  • 时间复杂度:O(1)O(1) 每组数据
  • 空间复杂度:O(1)O(1)

代码实现

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;
}

注意事项

  1. 输出格式必须严格符合题目要求
  2. 时间需要格式化为两位数字(前导零)
  3. 注意处理经过中午12点的情况
  4. 边界处理使用微小偏移量避免整数舍入问题
后话
本蒟蒻第一次写题解,写的不是很好,请见谅。望管理员通过。并且在写完本文后,使用了DeepSeek进行润色,一切后果由我承担。

评论

0 条评论,欢迎与作者交流。

正在加载评论...