天天看点

杭电1006 Tick and Tick

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

#include<iostream>  
#include<algorithm>  
#include<cstdio>  
#include<cstring>  
using namespace std;
/*
// 秒针速度  s = °/s  分针速度 m = /° /s 时针 h = /° /s  
const double SH =  / , SM =  / , MH =  / ;
const double tSH =  / , tSM =  / , tMH =  / ;

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 != -)
    {
        double bSH, bSM, bMH, eSH, eSM, eMH, Begin, End, Sum = ;
        bSH = D / SH;
        bSM = D / SM;
        bMH = D / MH;
        //计算第一次满足条件的时间(开始时间)  
        eSH = ( - D) / SH;
        eSM = ( - D) / SM;
        eMH = ( - D) / MH;
        //计算第一次不满足条件的时间(结束时间)  
        for (double b3 = bSH, e3 = eSH; e3 <= ; b3 += tSH, e3 += tSH)
        {
            for (double b2 = bMH, e2 = eMH; e2 <= ; b2 += tMH, e2 += tMH)
            {
                if (e2 < b3) //判断是否有交集  
                    continue;
                if (b2 > e3)
                    break;
                for (double b1 = bSM, e1 = eSM; e1 <= ; 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 / );
    }


    return ;
}*/
           
ACM