原题链接 Tick and Tick
题意
计算时针、分针、秒针24小时之内三个指针之间相差大于等于n度一天内所占百分比。
思路
每隔12小时时针、分针、秒针全部指向0,那么只需要计算12小时内的百分比就行。
秒针转动速度 6度/s
分针转动速度 1/10度/s
时针转动速度 1/120度/s
那么秒针与分针的相对速度为 59/10度/s
秒针与时针的相对速度为 719/120度/s
分针和时针的相对速度为 11/120度/s
计算两个指针相差一度需要的时间:
秒针和分针 sm=10/59s/度
秒针和时针 sh=120/719s/度
分针和时针 hm=120/11s/度
计算两个指针从分离到再次重合的周期:
秒针和分针 cir_sm=360*sm=3600/59s
秒针和时针 cir_sh=360*sh=43200/719s
分针和时针 cir_hm=360*hm=43200/11s
当degrees=n时
两个指针开始happy的时间:
s_sm=n*sm , s_sh=n*sh , s_hm=n*hm;//两指针间隔不再小于n的开始时间
两个指针结束happy的时间:
e_sm=cir_sm-s_sm , e_sh=cir_sh-s_sh , e_hm=cir_hm-s_hm;//两指针大于等于n的结束时间
两个指针happy的时间段:
秒针和分针happy时间的区间[s_sm,e_sm]
秒针和时针happy时间的区间[s_sh, e_sh]
分针和时针happy时间的区间[s_hm,e_hm]
显而易见,三个区间的交集就是三个指针都happy的时间段
start=max(s_sm,s_sh,s_hm);
end=min(e_sm,e_sh,e_hm);
如果 start < end
则区间 [start,end]就是三个区间的happy时间段
AC代码
#include<iostream>
#include<stdio.h>
using namespace std;
double sm=10./59.,sh=120./719.,hm=120./11.;
double cir_sm=3600./59.,cir_sh=43200./719.,cir_hm=43200./11.;
double s_sm,s_sh,s_hm; //start
double e_sm,e_sh,e_hm; //end
double mymax(double a,double b,double c)
{
if(a>b&&a>c)
return a;
if(b>a&&b>c)
return b;
return c;
}
double mymin(double a,double b,double c)
{
if(a<b&&a<c)
return a;
if(b<a&&b<c)
return b;
return c;
}
int main()
{
int n;//degrees
double res;
double start,end;
while(cin>>n&&n!=-1)
{
res=0.0;
s_sm=n*sm , s_sh=n*sh , s_hm=n*hm;
e_sm=cir_sm-s_sm , e_sh=cir_sh-s_sh , e_hm=cir_hm-s_hm;
start=mymax(s_sm,s_sh,s_hm);
end=mymin(e_sm,e_sh,e_hm);
while(start<=43200&&end<=43200)
{
if(start<end)
res+=end-start;
//judge
if(end==e_sm)
{
s_sm+=cir_sm; e_sm+=cir_sm;
}
else if(end==e_sh)
{
s_sh+=cir_sh; e_sh+=cir_sh;
}
else if(end==e_hm)
{
s_hm+=cir_hm; e_hm+=cir_hm;
}
start=mymax(s_sm,s_sh,s_hm);
end=mymin(e_sm,e_sh,e_hm);
}
printf("%.3f\n",res/432.);
}
return 0;
}
如有不当之处欢迎指出!