天天看點

杭電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