1006-Tick and Tick

来源:互联网 发布:windows代表什么 编辑:程序博客网 时间:2024/05/20 19:50

(http://acm.split.hdu.edu.cn/showproblem.php?pid=1006)

#include <iostream>#include <cmath>#include <iomanip> using namespace std;struct Segment{ double a,b;};double d;Segment makeseg1(double a, double b)//解集1 {    Segment seg;    seg.a=(a+d-360.0)/b;    seg.b=(a-d)/b;    if (seg.a<0.0) seg.a=0.0;    if (seg.b>60.0) seg.b=60.0;    if(seg.a>seg.b) seg.a=seg.b=0.0;    return seg;}Segment makeseg2(double a, double b)//解集2 {    Segment seg;    seg.a=(a+d)/b;    seg.b=(a-d+360.0)/b;    if (seg.a<0.0) seg.a=0.0;    if (seg.b>60.0) seg.b=60.0;    if(seg.a>seg.b) seg.a=seg.b=0.0;    return seg;}//求交集:定义运算符*  Segment operator *(Segment S1,Segment S2) {    Segment seg;    seg.a = max(S1.a,S2.a);    seg.b = min(S1.b,S2.b);    if( seg.a >= seg.b )        seg.a = seg.b = 0.0;    return seg;}int main(){    while(cin>>d)    {        if(d<0) break;        double totlen=0.0;        for(int h=0;h<12;h++)        {            for(int m=0;m<60;m++)            {                Segment s[3][2];                double a,b;                a=30.0*h - 5.5*m;    b=11.0/120;                s[0][0]=makeseg1(a,b);            s[0][1]=makeseg2(a,b);                a=30.0*h + 0.5*m;    b=719.0/120.0;                s[1][0]=makeseg1(a,b);            s[1][1]=makeseg2(a,b);                a=6.0*m;             b=5.9;                s[2][0]=makeseg1(a,b);            s[2][1]=makeseg2(a,b);                for(int i=0;i<2;i++)                for(int j=0;j<2;j++)                for(int k=0;k<2;k++)                {                    Segment tmp=s[0][i]*s[1][j]*s[2][k];//三者求交集                     totlen+=tmp.b-tmp.a;//求并:每一段区间秒数累加                 }            }        }        cout<<setprecision(3)<<setiosflags(ios::fixed);        cout<<totlen/432.0<<endl;    }    system("PAUSE");    return 1;}
0 0
原创粉丝点击