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
 
/////////////////////////////

算法分析

秒针(S): 1s 360/60= 6 度(degree)
分针(M): 1s 360/60*60= 1/10度(degree)
时针(H): 1s 360/60*60*12= 1/120度(degree)

秒针与分针的相对速度为:
V(M,S) = 6-1/10 = 59/10 d/s;
同理, 时针与秒针 V(H,S) = 6-1/120 =719/120 d/s;
V(H,M) = 1/10-1/120 = 11/120 d/s.

秒针与分针的相遇周期为
T(M,S)= 360/V(M,S)= 3600/59;
同理, T(H,S)= 360/V(H,S)=43200/719;
T(H,M)= 360/V(H,M)=43200/11;

在一天24小时内,后12个小时与前12个小时情况完全相同,故只取12个小时即可。
则12个小时总秒数
T = 12h * 60m* 60s = 43200s

秒针与分针的相遇次数为
N(M,S)=T/T(M,S) = 59*12 = 708
同理, N(H,S)=T/T(H,S) = 719
N(H,M)=T/T(H,M) = 11

由于周期性规律可知:
假设秒针与分针之间的角度用函数F(t)表示,则 F(t)为某一时刻t两针之间的角度。
F(t+n*T(M,S)) = F(t) , 其中n为自然数,
同理, F(t+n*T(H,S)) = F(t)
F(t+n*T(H,M)) = F(t)

所以,我们只要计算出第一个周期内的各指针之间的幸福时间区段,再加上若干个各自周期后,仍为幸福区段。
假设角度差至少为D时,秒针和分针才幸福,则在第一个周期T(M,S)内,
D<= V(M,S)*t <= 360-D

解得 t1=D/V(M,S)
t2=(360-D)/V(M,S);
根据周期性,
happy(t ms) =(t1+n*T(M,S),t2+n*T(M,S)) 0 <= n < N(M,S);
同理, happy(t hs ) =(t1+n*T(H,S),t2+n*T(H,S)) 0 <= n < N(H,S);
happy(t hm) =(t1+n*T(H,M),t2+n*T(H,M)) 0 <= n < N(H,M);

最后,求得三者的交集区间长度

L = happy(t ms) X happy(t hs) X happy(t hm) ,(X表示关系交)即可。

    #include <iostream>
#include <iomanip>
using namespace std;
const int T = *, NMS = ,NHM = , NHS = ; //相遇次数
const double F = 0.0466631; //F为调节系数,使得各区间段为准确值
const double hmlen = T*F/NHM,mslen = T*F/NMS,hslen = T*F/NHS;
struct interval
{
double low,high;
};
interval andset(interval S1,interval S2)
{
interval zone;
zone.low = S1.low > S2.low ? S1.low : S2.low;
zone.high = S1.high < S2.high ? S1.high : S2.high;
if( zone.low >= zone.high )
zone.low = zone.high = 0.0;
return zone;
}
int main()
{
int D=;
while(cin>>D&&D!=-)
{
double len = 0.0;
interval ms,hs,hm; hm.low = hmlen*D/ - hmlen;
hm.high = - hm.low -hmlen; ms.low = mslen*D/ - mslen;
ms.high = - ms.low -mslen; hs.low = hslen*D/ - hslen;
hs.high = - hs.low -hslen; for(int i=,j=,k=;i<NHM;i++)
{
hm.low+=hmlen;
hm.high+=hmlen; for(;j<NMS;j++)
{
ms.low+=mslen;
ms.high+=mslen; interval temp1 = andset(hm,ms);
if(temp1.low!=||temp1.high!=)
{
for(;k<NHS;k++)
{
hs.low+=hslen;
hs.high+=hslen; interval temp2 = andset(temp1,hs);
len+=temp2.high-temp2.low;
if(hs.high>=temp1.high)
{
hs.low-=hslen;
hs.high-=hslen;
break;
}
}
}
if(ms.high>=hm.high)
{
ms.low-=mslen;
ms.high-=mslen;
break;
}
}
}
cout<<setprecision()<<fixed<<len/(*F)<<endl;
}
return ;
}

hdoj1006--Tick and Tick的更多相关文章

  1. hdu1006 Tick and Tick

    原题链接 Tick and Tick 题意 计算时针.分针.秒针24小时之内三个指针之间相差大于等于n度一天内所占百分比. 思路 每隔12小时时针.分针.秒针全部指向0,那么只需要计算12小时内的百分 ...

  2. HDU 1006 Tick and Tick 时钟指针问题

    Tick and Tick Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  3. hdu 1006 Tick and Tick 有技巧的暴力

    Tick and Tick Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  4. HDU 1006 Tick and Tick(时钟,分钟,秒钟角度问题)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1006 Tick and Tick Time Limit: 2000/1000 MS (Java/Oth ...

  5. hdu 1006 Tick and Tick

    Tick and Tick Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  6. Tick and Tick

    The three hands of the clock are rotating every second and meeting each other many times everyday. F ...

  7. hdu_1006 Tick and Tick(暴力模拟)

    hdu1006 标签(空格分隔): 暴力枚举 好久没有打题了,退队了有好几个月了,从心底不依赖那个人了,原来以为的爱情戏原来都只是我的独角戏.之前的我有时候好希望有个人出现,告诉自己去哪里,做什么,哪 ...

  8. 1006 Tick and Tick

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1006 题意: 24小时中,三个指针之间超过某个度数的时间占所有时间的百分比是多少. 思路:主要是物理和数学 ...

  9. [ACM_模拟] HDU 1006 Tick and Tick [时钟间隔角度问题]

    Problem Description The three hands of the clock are rotating every second and meeting each other ma ...

  10. hdu1006 Tick and Tick (数学题 借鉴了大神的博客)

    先缩短一半的时间:早上的12个小时和下午的12小时对时钟是一样的,因为时钟12小时与0小时的三针位置相同.接着就是了解到每次所有的针从有重合到再次有重合至多有一段连续的段符合三针分离度大于n.所以只要 ...

随机推荐

  1. 阿里云 如何减少备份使用量? mysql数据库的完整备份、差异备份、增量备份

    RDS for MySQL备份.SQL审计容量相关问题_MYSQL使用_技术运维问题_云数据库 RDS 版-阿里云 https://help.aliyun.com/knowledge_detail/4 ...

  2. MariaDB数据库主从复制实现步骤

    一.MariaDB简介 MariaDB数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上. MariaDB数据库支持单向 ...

  3. 登录案例locustfile.py

    # 保存为locustfile.py # coding=utf-8 from locust import HttpLocust, TaskSet, task ''' 实现场景:先登录(只登录一次),然 ...

  4. JavaWeb—过滤器Filter

    1.Filter简介 Filter称之为过滤器,是用来做一些拦截的任务.比如客户端请求服务器的某个资源时(可以是Servlet.JSP.HTML等等),我们可以拦截.当服务器返回资源给客户端的时候,我 ...

  5. spring tiles界面为空白

    Caused by: org.apache.jasper.JasperException: /WEB-INF/views/admin_template.jsp(3,62) Unable to read ...

  6. C++实现计算器功能(包括计算含未知量的式子),输出后缀表达式

    大概描述        用c++语言在vc中实现部分数学计算功能.其中实现的数学计算功能包括加减乘除运算.开方计算.自然对数运算.以10为底的对数运算.幂计算.正弦余弦计算. 由用户输入要计算的表达式 ...

  7. What's the difference between 'Even if' and 'Even though'?

    为一个英语词组语法写一篇Blog: even if 与 even though 这两个词组大致意思相当,但强调的侧重有所不同. even if与even though的区别: even if一般引导的 ...

  8. C#加快Bitmap的访问速度

    在对Bitmap图片操作的时候,有时需要用到获取或设置像素颜色方法:GetPixel 和 SetPixel, 如果直接对这两个方法进行操作的话速度很慢,这里我们可以通过把数据提取出来操作,然后操作完在 ...

  9. iOS视图生命周期

    视图是应用的一个重要组成部分,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 1.视图生命周期与视图控制器关系 以视图的4 种状态为基础,我们来系统了解一下视图控制器的 ...

  10. python数据之间的转换和关系

    首先数据类型在我看来分为两类: 容器类:能存储数据,例如:元祖.列表.集合.字符串. 原子类:单纯保存数值,例如:整数.浮点数.复数. 容器类与容器类之间,一般都可以进行两两之间的转化. 原子类与原子 ...