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. 一张图玩转H5测试

    背景 随着各种H5页面的普及和运用,并深深的影响着我们各个业务的发展,前两年也对H5测试的有着不少积累,但都是根据项目的要求,这里测试下,那里测试下,今年上半年专门成立了H5测试研究虚拟小组,专门研究 ...

  2. Java死锁的理解

    我们有时候操作数据库的时候会遇到死锁,那么什么使死锁呢?它的一个比较官方的定义就是:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将 ...

  3. 任务06——封装与单元测试(Markdown版)

    模块代码地址 Core 模块代码地址 单元测试代码地址 两个地址是一样的,为了方便,所以把测试的代码很模块代码放在一起git了. 封装阶段 public class Core { public sta ...

  4. Eslint使用指南

    本文主要讲如何在前端项目中引入Eslint静态代码检查工具,提升代码质量和统一代码风格,避免一些低级错误. 一 引入静态代码检查工具的目的 在团队协作中,为避免低级 Bug.产出风格统一的代码,会预先 ...

  5. Hibernate 框架入门(一)

    1. SSH Web 层: Struts2 业务层: Spring 持久层: Hibernate 2. Hibernate 概述 概述 Hibernate 是一个对象关系映射框架(ORM 框架); 对 ...

  6. 解决Raize日历控件显示的问题

    解决Raize日历控件显示的问题 近自己的程序被测试人员发现一个小问题,就是程序中的日历选择框,显示中的“星期一.星期二....”都显示成了“星.....”,我自己看了代码,原来是raize的控件问题 ...

  7. hadoop学习第七天-HBase的原理、安装、shell命令

    一. hbase的原理知识 1. hbase介绍 hbase是hadoop的一个重要成员,主要用于存储结构化数据,构建在hdfs之上的分布式存储系统,它主要通过横向扩展,通用不断增加廉价服务器增加计算 ...

  8. 算法题14 小Q歌单,牛客网,腾讯笔试题

    算法题14 小Q歌单,牛客网,腾讯笔试题 题目: 小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌,现在小Q想用这些歌组成一个总长度正好为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌 ...

  9. English Phrases

    @1:Phrases requst sth from/of sb 向某人要求某物 a new lease on life   重获新生.焕发生机 state of the art 最先进的 at th ...

  10. pyhon时间输出

    参考博客:http://www.cnblogs.com/xisheng/p/7634125.html http://www.cnpythoner.com/post/89.html 有些时候想要输出,但 ...