开始我以为是一秒一秒动,后来才想到是连续的
本题目采用解方程方法 利用22针的度数差值函数 解方程
Vs = 6度每秒 (60秒走一圈360度 360/60=6)
Vm = 1/10度每秒(3600秒,一个小时走一圈, 360/3600=0.1)
Vh = 1/120度每秒(12小时走一圈,360/(3600*12)= 1/120)
然后,就可以得到每两根之间的速度差了:
Vsm = Vs - Vm = 6 - 1/10 = 59/10
Vsh = Vs - Vh = 6 - 1/120 = 719/120
Vmh = Vm - Vh = 1/10 - 1/120 = 11/120
(算法:Vsm * t = 180 ,所以 t = 180/Vsm = 180 /(59/10) = (180 * 10)/ 59
所以:
Dsm = (59/10) * t 或者 360 - (59/10) * t
Dsh = (719/120) * t 或者 360 - (719/120) * t
Dmh = (11/120) * t 或者 360 - (11/120) * t
#include<iostream>
#include<iomanip>
using namespace std;
const int N=3000;
typedef struct //每个区间的结构
{
double x,y;
}TypePoint;
TypePoint A[N],B[N],C[N],D[N],E[N];
int i,j,z,m,n;
int JiaoJi(TypePoint a[],int s,TypePoint b[],int h,TypePoint c[],int k) //求时间区间交集
{
int q,p;
k=0;
for(q=0; q<s; q++)
for(p=0; p<h; p++)
{
if( a[q].x <= b[p].x && a[q].y >= b[p].x && a[q].y <= b[p].y ) //求时间区间交集 有4种情况
{ c[k].x=b[p].x; c[k++].y=a[q].y; }
if( b[p].x <= a[q].x && b[p].y >= a[q].x && b[p].y <= a[q].y )
{ c[k].x=a[q].x; c[k++].y=b[p].y; }
if( a[q].x >= b[p].x && a[q].y <= b[p].y )
{ c[k].x=a[q].x; c[k++].y=a[q].y; }
if( b[p].x >= a[q].x && b[p].y <= a[q].y )
{ c[k].x=b[p].x; c[k++].y=b[p].y; }
}
return k; //还回交集数组的大小
}
int main()
{
double d, t, Tsum=43200.0; //度,happytime的时间,总时间(12个小时即可)
double Vsm=59.0/10, Vmh=11.0/120, Vsh=719.0/120; //每2个针的度数差值 second minute hour
double Tsm=3600.0/59, Tmh=43200.0/11, Tsh=43200.0/719; //每2个针的度数差值函数的周期
double Tsm1, Tsm2, Tmh1, Tmh2, Tsh1, Tsh2; //记录第一个周期中,每2个针的度数差的时间区间
int f1, f2, f3, g;
while( cin>>d && d!=-1 )
{
if( d==0 ) //度数为零的情况
{ cout<< setprecision(3) << setiosflags(ios::fixed) <<100.0 <<endl;
continue;
}
if( d>=120 ) //大于120度时 概率为0
{ cout<< setprecision(3) << setiosflags(ios::fixed) <<0.0 <<endl;
continue;
}
Tsm1=d/Vsm; Tsm2=Tsm - Tsm1; //计算第一个周期内的 每2个针的度数差的时间区间
Tmh1=d/Vmh; Tmh2=Tmh - Tmh1;
Tsh1=d/Vsh; Tsh2=Tsh - Tsh1;
i=0; j=0; z=0;
f1=0; f2=0; f3=0;
while(1) //分别保存每个周期内符合的时间区间
{
if( Tsm1 <= Tsum )
{
A.x = Tsm1; Tsm1 += Tsm;
if( Tsm2 <= Tsum )
{ A.y = Tsm2; Tsm2 += Tsm; }
i++;
}
else
f1=1;
if( Tmh1 <= Tsum )
{
B[j].x = Tmh1; Tmh1 += Tmh;
if( Tmh2<=Tsum )
{ B[j].y=Tmh2; Tmh2+=Tmh; }
j++;
}
else
f2=1;
if( Tsh1 <= Tsum )
{
C[z].x = Tsh1; Tsh1 += Tsh;
if( Tsh2 <= Tsum )
{ C[z].y = Tsh2; Tsh2 += Tsh; }
z++;
}
else
f3=1;
if( f1==1 && f2==1 && f3==1) //三种情况都保存后 退出循环
break;
}
m=0; n=0;
m=JiaoJi(A, i, B, j, D, m); //两两求时间区间的交集
n=JiaoJi(D, m , C, z, E, n);
t=0;
for(g=0; g<n; g++) //将最后的时间区间交集,求出符合Happytime的总时间
t=t+( E[g].y-E[g].x);
cout<< setprecision(3) << setiosflags(ios::fixed) << (t/Tsum)*100<<endl;
}
return 0;
}