杭电1006 Tick and Tick

来源:互联网 发布:阿里云 mongodb 连接 编辑:程序博客网 时间:2024/06/08 05:43

这个方法我是参考网上大神写的代码。这一题比较难。看了很久没看懂。没想到最后使用了角速度这个概念。

#include<iostream>  #include<algorithm>  #include<cstdio>  #include<cstring>  using namespace std;/*// 秒针速度  s = 6°/s  分针速度 m = 1/10° /s 时针 h = 1/120° /s  const double SH = 719.0 / 120, SM = 59.0 / 10, MH = 11.0 / 120;const double tSH = 43200.0 / 719, tSM = 3600.0 / 59, tMH = 43200.0 / 11;double Min(double a, double b, double c){    return min(a, min(b, c));}double Max(double a, double b, double c){    return max(a, max(b, c));}int main(){    double D;    while (cin >> D && D != -1)    {        double bSH, bSM, bMH, eSH, eSM, eMH, Begin, End, Sum = 0;        bSH = D / SH;        bSM = D / SM;        bMH = D / MH;        //计算第一次满足条件的时间(开始时间)          eSH = (360 - D) / SH;        eSM = (360 - D) / SM;        eMH = (360 - D) / MH;        //计算第一次不满足条件的时间(结束时间)          for (double b3 = bSH, e3 = eSH; e3 <= 43200.000001; b3 += tSH, e3 += tSH)        {            for (double b2 = bMH, e2 = eMH; e2 <= 43200.000001; b2 += tMH, e2 += tMH)            {                if (e2 < b3) //判断是否有交集                      continue;                if (b2 > e3)                    break;                for (double b1 = bSM, e1 = eSM; e1 <= 43200.000001; b1 += tSM, e1 += tSM)                {                    if (e1 < b2 || e1 < b3)                        continue;                    if (b1 > e2 || b1 > e3)                        break;                    Begin = Max(b1, b2, b3);  //开始时间取最大,以满足全部要求                      End = Min(e1, e2, e3);    //结束时间取最小,以满足全部要求                      Sum += (End - Begin);                }            }        }        printf("%.3lf\n", Sum / 432);    }    return 0;}*/