本文共 3857 字,大约阅读时间需要 12 分钟。
思想:
由于要记录连续时间,那么就利用区间记录,[begin,end]。另外,就拿时针和分针来做例子吧。时针的角速度为 w_h=360.0/12*60*60=1.0/120,分针的角速度为w_m=360.0/60*60=1.0/10。两者的相对角速度为 w_hm=w_m-w_h,“相对周期”为T_hm=360.0/w_hm。所谓的相对周期就是时针和分针出现重复的相对关系的最小时间。
这样的话就可以把时针和分针,时针和秒针,分针和秒针各自满足条件的集合求交集。显然,代码中利用的是三个for循环来暴力解决。不过有些显然不满足条件的情况即可去除,以减少计算次数。
x[3]和y[3]记录的是第一个开始满足条件的时间和第一个开始不满足条件的时间。m[3],n[3]则是分表根据相对周期来扩大x[3],y[3]以获得所有满足条件的时间集合,并求交集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include<iostream> #include<iomanip> #include <algorithm> using namespace std; const double hm = 11.0/120, hs = 719.0/120, sm = 59.0/10; //相对角速度 const double T_hm = 43200.0/11, T_hs = 43200.0/719, T_sm = 3600.0/59; //相对周期 inline double min( double a, double b, double c) { double temp[3] = {a,b,c}; return *std::min_element(temp,temp+3); } inline double max( double a, double b, double c) { double temp[3] = {a,b,c}; return *std::max_element(temp,temp+3); } int main() { double degree; double x[3],y[3]; double m[3],n[3]; double end,begin,sum; while (cin>>degree , degree!=-1) { x[0]=degree/hm; x[1]=degree/hs; x[2]=degree/sm; y[0]=(360-degree)/hm; y[1]=(360-degree)/hs; y[2]=(360-degree)/sm; sum=0.0; for (m[0]=x[0],n[0]=y[0];n[0]<=43200.000001;m[0]+=T_hm,n[0]+=T_hm) { for (m[1]=x[1],n[1]=y[1];n[1]<=43200.000001;m[1]+=T_hs,n[1]+=T_hs) { for (m[2]=x[2],n[2]=y[2];n[2]<=43200.000001;m[2]+=T_sm,n[2]+=T_sm) { begin=max(m[0],m[1],m[2]); end=min(n[0],n[1],n[2]); if (end>begin) sum+=end-begin; } } } cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum*100.0/43200<<endl; } return 0; } |
用库尼玛 超时自己实现比较
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include<iostream> #include<iomanip> using namespace std; const double hm=11.0/120,hs=719.0/120,sm=59.0/10; //相对角速度 const double T_hm=43200.0/11,T_hs=43200.0/719,T_sm=3600.0/59; //相对周期 inline double min( double a, double b, double c) { double temp=(a>b)?b:a; return (c>temp)?temp:c; } inline double max( double a, double b, double c) { double temp=(a>b)?a:b; return (c>temp)?c:temp; } int main() { double degree; double x[3],y[3]; double m[3],n[3]; double end,begin,sum; while (cin>>degree , degree!=-1) { x[0]=degree/hm; x[1]=degree/hs; x[2]=degree/sm; y[0]=(360-degree)/hm; y[1]=(360-degree)/hs; y[2]=(360-degree)/sm; sum=0.0; for (m[0]=x[0],n[0]=y[0];n[0]<=43200.000001;m[0]+=T_hm,n[0]+=T_hm) { for (m[1]=x[1],n[1]=y[1];n[1]<=43200.000001;m[1]+=T_hs,n[1]+=T_hs) { if (n[0]<m[1]) break ; if (m[0]>n[1]) continue ; for (m[2]=x[2],n[2]=y[2];n[2]<=43200.000001;m[2]+=T_sm,n[2]+=T_sm) { if (n[0]<m[2] || n[1]<m[2]) break ; if (m[0]>n[2] || m[1]>n[2]) continue ; begin=max(m[0],m[1],m[2]); end=min(n[0],n[1],n[2]); if (end>begin) sum+=end-begin; } } } cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum*100.0/43200<<endl; } return 0; } |
转载地址:http://rjbva.baihongyu.com/