http://acm.hdu.edu.cn/showproblem.php?pid=1006
题意:给你一个角度n,要你求一天内三个指针角度差都大于n的时间占总时间的百分百
第一次写的时候以为是按秒来算的,写完后发现精度不够,然后再别人博客上看到要用角速度来算。
思路:求出每两个指针的相对角速度(两个指针夹角变化的速度),求出相对周期(可以理解为两个指针第一次重合和第二次重合的时间差),求出每两个指针满足角度关系的时间范围,最后求出交集就好了。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const double s_m = 59.0/10.0, s_h = 719.0/120.0, m_h = 11.0/120.0;//相对角速度
const double t_sm = 3600.0/59.0, t_sh = 43200.0/719.0, t_mh = 43200.0/11.0;//相对周期
int main()
{
int n;
double st[3], et[3];
while(~scanf("%d", &n) && ~n){
st[0] = n / s_m; st[1] = n / s_h; st[2] = n / m_h; //满足条件的起始时间
et[0] = (360 - n) / s_m; et[1] = (360 - n) / s_h; et[2] = (360 - n) / m_h;//满足条件的终止时间
double sum = 0;
double si[3], ti[3];
//分别求每个相对周期的交集
for(si[0] = st[0], ti[0] = et[0]; ti[0] <= 43200.00001; si[0] += t_sm, ti[0] += t_sm){
for(si[1] = st[1], ti[1] = et[1]; ti[1] <= 43200.00001; si[1] += t_sh, ti[1] += t_sh){
if(ti[0] < si[1])
break;
if(si[0] > ti[1])
continue;
for(si[2] = st[2],ti[2] = et[2];ti[2] <= 43200.00001;si[2] += t_mh, ti[2] += t_mh){
if(ti[0] < si[2] || ti[1] < si[2])
break;
if(si[0] > ti[2] || si[1] > ti[2])
continue;
double bi = max(si[0], max(si[1], si[2]));
double ed = min(ti[0], min(ti[1], ti[2]));
if(ed > bi)
sum += ed - bi;
}
}
}
printf("%.3lf\n", sum/432.0);
}
return 0;
}