hdu-Tick and Tick解题报告
0 120 90 -1
100.000 0.000 6.251
输入一个非负整数D,当时针、分针、秒针,之中任意两者之间的夹角大于D,则会happy。现在要求总的happy的时间占的百分比(基于12个小时),保留三位小数。
解题思路:
1、每秒钟的移动速度(多少度),(s:秒针,m:分针,h:时针): s=6 /s m=(1/10) /s h=(1/120) /s
2、三种针之间相对速度 : s_m=(59/10) /s s_h=(719/120) /s m_h=(11/120) /s
3、移动一度所需要的时间: s_m=(10/59) s s_h=(120/719) s m_h=(120/11) s
4、周期: ts_m=(3600/59) s ts_h=(43200/719) s tm_h=(43200/11) s
所以,假设输入的D=n;则有:
n*s_m + k1*ts_m < T < ts_m - n*s_m + k1*ts_m
n *s_h + k2*ts_h < T < ts_h - n*s_h + k2*ts_h
n* m_h + k3*tm_h <T < tm_h - n*m_h +k3*tm_h
当T同时满足这三个式子时,便是happy的时间;
#include<stdio.h>
#include<math.h>
int main()
{
int t;
double n,sm,sh,mh,tsm,tsh,tmh,fsm,fsh,fmh,esm,esh,emh,b1,e1,b2,e2,b3,e3,min,max,sum;
sm=10.0/59.0;
sh=120.0/719.0;
mh=120.0/11.0;
tsm=3600.0/59.0;
tsh=43200.0/719.0;
tmh=43200.0/11.0;
while(~scanf("%lf",&n))
{
if(n<0)break;
sum=0;
fsm=n*sm;esm=tsm-fsm;
fsh=n*sh;esh=tsh-fsh;
fmh=n*mh;emh=tmh-fmh;
for(b3=fmh,e3=emh;e3<=43200;b3+=tmh,e3+=tmh)//找出满足三个式子的T,并且求和得到sum
{
for(b2=fsh,e2=esh;e2<=43200;b2+=tsh,e2+=tsh)
{
if(e2<b3)
continue;
if(b2>e3)
break;
for(t=0,b1=fsm,e1=esm;e1<=43200;t=t+1,b1=fsm+t*tsm,e1=esm+t*tsm)
{
if(e1<b2||e1<b3)
continue;
if(b1>e2||b1>e3)
break;
max=b1>b2?b1:b2;
max=max>b3?max:b3;
min=e1<e2?e1:e2;
min=min<e3?min:e3;
sum+=min-max;
}
}
}
printf("%.3lf\n",sum/432.0);//因为要求百分比,所以sum应该除以12个小时即43200秒,再乘以100
}
return 0;
}
本文针对HDU在线评测平台上的TickandTick问题,详细解析了如何通过计算时钟三针之间的角度来确定“快乐”状态的时间百分比。文章提供了具体的数学模型和C语言实现代码。
636

被折叠的 条评论
为什么被折叠?



