UVA1529 题解

· · 题解

UVA1529 时钟 题解

原题传送门

题目大意

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

输入格式

多组数据,每组数据包含四个整数:

输出格式

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

解题思路

1. 相对运动分析

2. 相遇周期计算

分针相对于时针每多走一圈(360°)就超越一次,超越周期为:

T = \\frac{360°}{5.5°/min} = \\frac{720}{11} \\approx 65.454545\\text{分钟}

3. 计算方法

将时间统一转换为分钟:

如果end < start,说明经过了12点,需要给end加上720分钟。

超越次数计算公式:

passes = \\left\\lfloor\\frac{end - \\epsilon}{T}\\right\\rfloor - \\left\\lfloor\\frac{start - \\epsilon}{T}\\right\\rfloor

其中\\epsilon = 0.0001用于处理边界情况(题目保证不会正好在超越时刻)。

算法步骤

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

复杂度分析

代码实现

#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. 边界处理使用微小偏移量避免整数舍入问题

::::info[后话] 本蒟蒻第一次写题解,写的不是很好,请见谅。望管理员通过。并且在写完本文后,使用了DeepSeek进行润色,一切后果由我承担。 ::::