• 1006 Tick and Tick


    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1006

    题意:

    24小时中,三个指针之间超过某个度数的时间占所有时间的百分比是多少。


    思路:主要是物理和数学的综合 难在相对速度的运用
    秒钟的速度

    s=6°/s,分针是1/10°/s,时针是1/120°/s

    所以相对速度

    s_m=59/10°/s,s_h=719/120°/s,m_h=11/120°/s
    所以相差一度所需要的时间

    sm=10/59 s/°,sh=120/719 s/°,mh=120/11 s/°
    他们差360°的周期为

    tsm=3600/59 s,tsh=43200/719 s,tmh=43200/11 s
    需要相差的角度为n。
    rsm>n → n*sm+k1*tsm < t < tsm-n*sm+k1*tsm;
    rsh>n → n*sh+k2*tsh < t < tsh-n*sh+k2*tsh;
    rmh>n → n*mh+k3*tmh < t < tmh-n*mh+k3*tmh;
    三个条件都满足所占的总时间即为时针、分针、秒针相差角度大于n的总时间

    在对两两指针之间满足条件的开始时间和结束时间进行遍历(三重循环),把所有满足条件的时

    间累加起来就是所求满足条件的总时间。最后结果为:满足条件的总时间/43200*100。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstring>
     5 using namespace std;
     6 // 秒针速度  s = 6°/s  分针速度 m = 1/10° /s 时针 h = 1/120° /s
     7 const double SH = 719.0/120, SM = 59.0/10, MH = 11.0/120;//Relative angular velocity 相对角速度
     8 const double tSH = 43200.0/719, tSM = 3600.0/59, tMH = 43200.0/11;
     9  
    10 double Min(double a,double b,double c)
    11 {
    12     return min(a,min(b,c));
    13 }
    14  
    15 double Max(double a,double b,double c)
    16 {
    17     return max(a,max(b,c));
    18 }
    19  
    20 int main()
    21 {
    22     double D;
    23     while(cin >> D && D!=-1)
    24     {
    25         double bSH,bSM,bMH,eSH,eSM,eMH,Begin,End,Sum = 0;
    26         bSH = D / SH;
    27         bSM = D / SM;
    28         bMH = D / MH;
    29         //计算第一次开始时间
    30         eSH = (360-D)/SH;
    31         eSM = (360-D)/SM;
    32         eMH = (360-D)/MH;
    33         //计算第一次结束时间
    34         for(double b3 = bSH,e3 = eSH; e3 <= 43200.000001; b3+=tSH,e3+=tSH)
    35         {
    36             for(double b2 = bMH,e2 = eMH; e2 <= 43200.000001; b2+=tMH,e2+=tMH)
    37             {
    38                 if(e2 < b3) //判断是否有交集
    39                     continue;
    40                 if(e3 < b2)
    41                     break;
    42                 for(double b1 = bSM,e1 = eSM; e1 <= 43200.000001; b1+=tSM,e1+=tSM)
    43                 {
    44                     if(e1 < b2 || e1 < b3)
    45                         continue;
    46                     if(b1 > e2 || b1 > e3)
    47                         break;
    48                     Begin = Max(b1,b2,b3);  //开始时间取最大,以满足全部要求
    49                     End = Min(e1,e2,e3);    //结束时间取最小,以满足全部要求
    50                     Sum += (End-Begin);
    51                 }
    52             }
    53         }
    54         printf("%.3lf
    ",Sum/432);
    55     }
    56     return 0;
    57 }

  • 相关阅读:
    sqlserver 游标格式 东师理想
    java流下载 东师理想
    列出所有K个元素的子集2013年1月26日
    你刚才在淘宝上买了一件东西【技术普及贴】(转载)
    递归统计项目中的非空白代码行数
    算法(数据结构)每天一题 2013年1月21日
    《TCP/IP详解卷1》学习小结(二)Internet Protocol
    产生所有排列字典顺序2013年1月23日
    产生所有排列旋转法2013年1月22日
    《TCP/IP详解卷1》学习小结(三)ARP协议与RARP协议
  • 原文地址:https://www.cnblogs.com/CheeseIce/p/10427847.html
Copyright © 2020-2023  润新知