hdu 1006 Tick and Tick (解不等式方程)

// Time 46ms, Memory 328K
#include<iostream>
#include<iomanip>
using namespace std;
double d;
struct range
{
    double l,r;
};
range get(double a,double b)
{
    range p;
    if(a<0)
    {
        p.r=(d-b)/a;p.l=(360-d-b)/a;
    }
    else
    {
        p.l=(d-b)/a;p.r=(360-d-b)/a;
    }
    if(p.l<0) p.l=0;
    if(p.r>60) p.r=60;
    if(p.l>p.r) p.l=p.r=0;
    return p;
}
range set(range a,range b)
{
    range p;
    p.l=a.l>b.l?a.l:b.l;
    p.r=a.r>b.r?b.r:a.r;
    if(p.l>p.r) p.l=p.r=0;
    return p;
}
double f(int x,int y)
{
    int i,j,k;
    double m,h,a,b,rea=0.0;
    range s[3][2],s1;
    m=1.0*y;h=1.0*x;
    a=1.0/120-0.1;
    b=30*h-5.5*m;
    s[0][0]=get(a,b);
    s[0][1]=get(-a,-b);
    a=1.0/120-6;
    b=30*h+0.5*m;
    s[1][0]=get(a,b);
    s[1][1]=get(-a,-b);
    a=0.1-6;
    b=6*m;
    s[2][0]=get(a,b);
    s[2][1]=get(-a,-b);
    for(i=0;i<2;i++)
        for(j=0;j<2;j++)
            for(k=0;k<2;k++)
            {
                s1=set(set(s[0][i],s[1][j]),s[2][k]);
                rea+=s1.r-s1.l;
            }
    return rea;
}
int main()
{
    int i,j;
    double s;
    while(cin>>d && d!=-1)
    {
        s=0.0;
        for(i=0;i<12;i++)
        {
            for(j=0;j<60;j++)
            {
                s+=f(i,j);
            }
        }
        cout<<fixed<<setprecision(3)<<s*100.0/(3600*12)<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/java20130726/p/3218182.html