HDU 1006 Tick and Tick 时钟指针问题

简介:

Tick and Tick

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10194    Accepted Submission(s): 2859


Problem Description
The three hands of the clock are rotating every second and meeting each other many times everyday. Finally, they get bored of this and each of them would like to stay away from the other two. A hand is happy if it is at least D degrees from any of the rest. You are to calculate how much time in a day that all the hands are happy.
 

Input
The input contains many test cases. Each of them has a single line with a real number D between 0 and 120, inclusively. The input is terminated with a D of -1.
 

Output
For each D, print in a single line the percentage of time in a day that all of the hands are happy, accurate up to 3 decimal places.
 

Sample Input
 
 
0 120 90 -1
 

Sample Output
 
 
100.000 0.000 6.251
 

思想:

由于要记录连续时间,那么就利用区间记录,[begin,end]。另外,就拿时针和分针来做例子吧。时针的角速度为 w_h=360.0/12*60*60=1.0/120,分针的角速度为w_m=360.0/60*60=1.0/10。两者的相对角速度为 w_hm=w_m-w_h,“相对周期”为T_hm=360.0/w_hm。所谓的相对周期就是时针和分针出现重复的相对关系的最小时间。

这样的话就可以把时针和分针,时针和秒针,分针和秒针各自满足条件的集合求交集。显然,代码中利用的是三个for循环来暴力解决。不过有些显然不满足条件的情况即可去除,以减少计算次数。

x[3]和y[3]记录的是第一个开始满足条件的时间和第一个开始不满足条件的时间。m[3],n[3]则是分表根据相对周期来扩大x[3],y[3]以获得所有满足条件的时间集合,并求交集。


代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include<iostream>
#include<iomanip>
#include <algorithm>
 
using namespace std;
 
const double hm = 11.0/120,
              hs = 719.0/120,
              sm = 59.0/10;       //相对角速度
const double T_hm = 43200.0/11,
              T_hs = 43200.0/719,
              T_sm = 3600.0/59;   //相对周期
 
inline double min( double a, double b, double c)
{
     double temp[3] = {a,b,c};
     return *std::min_element(temp,temp+3);
}
 
inline double max( double a, double b, double c)
{
     double temp[3] = {a,b,c};
     return *std::max_element(temp,temp+3);
}
 
int main()
{
     double degree;
     double x[3],y[3];
     double m[3],n[3];
     double end,begin,sum;
 
     while (cin>>degree , degree!=-1)
     {
         x[0]=degree/hm;
         x[1]=degree/hs;
         x[2]=degree/sm;
 
         y[0]=(360-degree)/hm;
         y[1]=(360-degree)/hs;
         y[2]=(360-degree)/sm;
 
         sum=0.0;
         for (m[0]=x[0],n[0]=y[0];n[0]<=43200.000001;m[0]+=T_hm,n[0]+=T_hm)
         {
             for (m[1]=x[1],n[1]=y[1];n[1]<=43200.000001;m[1]+=T_hs,n[1]+=T_hs)
             {
                 for (m[2]=x[2],n[2]=y[2];n[2]<=43200.000001;m[2]+=T_sm,n[2]+=T_sm)
                 {
                     begin=max(m[0],m[1],m[2]);
                     end=min(n[0],n[1],n[2]);
                     
                     if (end>begin)
                        sum+=end-begin;
                 }
             }
         }
 
         cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum*100.0/43200<<endl;
     }
 
     return 0;
}

 

 

用库尼玛 超时自己实现比较

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include<iostream>
#include<iomanip>
using namespace std;
 
 
const double hm=11.0/120,hs=719.0/120,sm=59.0/10;    //相对角速度
const double T_hm=43200.0/11,T_hs=43200.0/719,T_sm=3600.0/59;   //相对周期
 
inline double min( double a, double b, double c)
{
     double temp=(a>b)?b:a;
 
     return (c>temp)?temp:c;
}
 
inline double max( double a, double b, double c)
{
     double temp=(a>b)?a:b;
 
     return (c>temp)?c:temp;
}
 
int main()
{
     double degree;
     double x[3],y[3];
     double m[3],n[3];
     double end,begin,sum;
 
     while (cin>>degree , degree!=-1)
     {
         x[0]=degree/hm;
         x[1]=degree/hs;
         x[2]=degree/sm;
 
         y[0]=(360-degree)/hm;
         y[1]=(360-degree)/hs;
         y[2]=(360-degree)/sm;
 
         sum=0.0;
         for (m[0]=x[0],n[0]=y[0];n[0]<=43200.000001;m[0]+=T_hm,n[0]+=T_hm)
         {
             for (m[1]=x[1],n[1]=y[1];n[1]<=43200.000001;m[1]+=T_hs,n[1]+=T_hs)
             {
                 if (n[0]<m[1])
                     break ;
                 if (m[0]>n[1])
                     continue ;
 
                 for (m[2]=x[2],n[2]=y[2];n[2]<=43200.000001;m[2]+=T_sm,n[2]+=T_sm)
                 {
                     if (n[0]<m[2] || n[1]<m[2])
                         break ;
                     if (m[0]>n[2] || m[1]>n[2])
                         continue ;
 
                     begin=max(m[0],m[1],m[2]);
                     end=min(n[0],n[1],n[2]);
                     
                     if (end>begin)
                        sum+=end-begin;
                 }
             }
         }
 
         cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum*100.0/43200<<endl;
     }
 
     return 0;
}
相关文章
|
JavaScript 前端开发 算法
html+css+JavaScript实现简洁的圆形时钟数字时钟+指针时钟
使用前端三件套实现一个实时跟新的时钟,其中包括电子时钟和刻度时钟
339 0
html+css+JavaScript实现简洁的圆形时钟数字时钟+指针时钟
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
164 13
|
7月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
3月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
42 0
|
4月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
160 4
|
5月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
|
5月前
|
C语言
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
|
5月前
|
存储 编译器 C语言
【C初阶——指针3】鹏哥C语言系列文章,基本语法知识全面讲解——指针(3)
【C初阶——指针3】鹏哥C语言系列文章,基本语法知识全面讲解——指针(3)
|
6月前
|
编译器 C语言
【C语言初阶】指针篇—下
【C语言初阶】指针篇—下