• ZOJ 1122. Clock


      http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=122 

      题目:给出两个时刻 t1 (h1:m1), t2 (h2:m2); 其中 h1,h2 表示小时属于 [1, 12] , m1, m2表示分钟属于 [0, 59],t1 到 t2 的间隔跨度小于 12 小时。要求输出从 t1 到 t2 的间隔内,分针扫过时针(即两者重叠)有多少次。具体的题意大概就是这样,弄起来还是有点复杂。最终没看明白对输出格式的要求还 wa 一次。 

      分析:设在某 t ( h : m ) 时刻,时针和分针重叠,则:

      m / 60 = ( h + m / 60 ) / 12;  ----意义是指针和 12 点方向组成的夹角占整个圆周的占比;

      因此得到两针重叠时刻满足: m = h * 60 / 11; (浮点数)

      最终相当于在一个圆环上有 11 个点,每当时针指向这11个点是,即为时针分针重叠的时刻。这 11 个时刻点是:
      0 点 0 分,1 点 5.45 分,2 点 10.90 分,3 点 16.36 分, 4 点 21.81 分,...,10 点 54.55 分,共11个点。在下图中用红色点给出11个钟面上时针分针的重合点。

      

      现在问题是给定两个时刻中间,会夹多少个点(图中红点)。题目条件限定时间间隔会小于 12 小时。


      解题思路: 首先用一个数组,把 上面的11个点的分钟浮点数计算后存储起来。并把这些点用 0 到 10 进行编号(实际上即为该数组的索引)。在实际代码中实际上是准备了 12 个点,因为首尾两个点实际是同一点,11:60 分即为 0点0分。但为了判断方便还是多准备了一个点。

      对于一个给定的时刻,我们得出一个结果,即在它和0点之间最靠近它的时刻点的编号。(相当于从 0 点起算,到达该时刻一共会跨越几个点)。然后我们把两个时刻的得到的结果相减,就是最终答案(在此间隔内,时针分针重叠了几次)。

      这里还要对 12 点特别的转成 0 点去求结果。然后判断时针走的是哪半圈,即时针只能顺时针转动,如果结束的时刻小,说明它跨越了 12 点,这时候需要对结果加 11 !(因为时针圆周上一共有 11 个重叠时刻点)。特别注意比较时刻大小时,需要把 12 点 m 分当作 0 点 m 分。 

    #include <stdio.h>
    double M[12];
    void Init()
    {
        int i;
        for(i = 0; i < 12; i++)
        {
            M[i] = 60.00 * i / 11;
        }
    }
    int getIndex(int h1, int m1)
    {
        if(m1 > M[h1])
            return h1;
        else
            return h1 - 1;
    }
    int main(int argc, char* argv[])
    {
        int h1, m1, h2, m2;
        int _h1, _h2, index1, index2, result;
    
        Init();
    
        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)
        {
            _h1 = (h1 >= 12)? 0 : h1;
            _h2 = (h2 >= 12)? 0 : h2;
            
            index1 = getIndex(_h1, m1);
            index2 = getIndex(_h2, m2);        
            result = (index2 - index1);
            
            if((_h1 * 60 + m1) > (_h2 * 60 + m2))
                result += 11;
    
            printf("   %02d:%02d   %02d:%02d%8ld\n", 
                h1, m1, h2, m2, result);
        }
        printf("End of program 3 by team X\n");
        return 0;
    }
  • 相关阅读:
    使用RSL 给FLEX 瘦身
    网络游戏同步法则
    .NET中的内存管理,GC机制,内存释放过程
    C++静态成员函数小结(转)
    关于GetSystemMetrics()函数
    CImage
    assert()函数用法总结
    Win32 系统部分函数
    818瘦身简单过程(增加内存)
    818内存升级到128m
  • 原文地址:https://www.cnblogs.com/hoodlum1980/p/2996137.html
Copyright © 2020-2023  润新知