ZOJ 1122. Clock

news/2024/7/5 5:23:35

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

http://www.niftyadmin.cn/n/1117773.html

相关文章

单反不穷三代的方法

玩单反已经6年了,说说怎么做才不会不穷三代 有人说单反是败家的根源&#xff0c;有人说一入单反穷三代&#xff0c;有人说想害一个人就送他一台单反。总之&#xff0c;单反就是一条不归路。 为什么要用单反 1、能够更换镜头&#xff0c;拥有各种镜头。2、更好的成像效果。3、高…

c# winform实现截图并保持图片功能

最近项目需要对界面进行截图并保存的功能&#xff0c;在网上搜索了下结合实际需求最终完成功能&#xff0c;代码如下 //调用导图 private void pictureBox4_Click(object sender, EventArgs e) { Bitmap bitmap new Bitmap(this.Width, this.Height); Dra…

python中idle什么意思_python中idle是什么意思

python中idle是什么意思&#xff1f;IDLE是Python软件包自带的一个集成开发环境&#xff0c;初学者可以利用它方便地创建、运行、测试和调试Python程序。IDLE是开发 python 程序的基本IDE(集成开发环境)&#xff0c;具备基本的IDE的功能&#xff0c;是非商业Python开发的不错的…

课堂讨论

我们的小组是唐炳辉、蒋陵郡、孙哲、王宏伟。我们讨论的结果是这样的&#xff1a; 唐炳辉说&#xff1a;我们应该确定系统的业务范围&#xff0c;数据的来源和去向。而且&#xff0c;我们要动态跟踪用户的要求。 蒋陵郡说&#xff1a;利益相关者主要有系统管理员&#xff08;教…

Valentine's Day Round 1001.Ferries Wheel(hdu 5174)解题报告

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid5174 题目意思&#xff1a;给出 n 个人坐的缆车值&#xff0c;假设有 k 个缆车&#xff0c;缆车值 A[i] 需要满足&#xff1a;A[i−1]<A[i]<A[i1](1<i<K)。现在要求的是&#xff0c;有多少人满足&a…

mysql+php

1.Mysql安装 * yum install gcc-c ncurses-devel -y ##解决依赖性 * tar zxf mysql-boost-5.7.17.tar.gz ##解压文件 * tar zxf mysql-boost-5.7.17.tar.gz ##安装CMAKE工具 * useradd -M -d /usr/local/lnmp/nginx -s /sbin/nologin -u 800 nginx ##添加用户 * cm…

jQuery ajax的traditional参数的作用

为什么80%的码农都做不了架构师&#xff1f;>>> 一般的&#xff0c;可能有些人在一个参数有多个值的情况下&#xff0c;可能以某个字符分隔的形式传递&#xff0c;比如页面上有多个checkbox&#xff1a; $.ajax{url:"xxxx",data:{p: "123,456,789&…

关于target=_new和_blank的区别!

为了弄清楚这个问题我们来看三段代码产生的结果&#xff1a; code1&#xff1a; <html><head><title> new和blank的区别 </title></head><frameset cols"30%, *">     <!-- 分别调用target为new和blank的两段代码 --&g…