hdu1006

#include<stdio.h>
#include
using namespace std;
#define INF 0x7fffffff
double D;
struct node
{
double l;
double r;
}s[3][2];
node interval(double a,double b)//解方程D<=|a*s-b|<=360-D
{
node p;
if(a>0)
{
p.l=(D-b)/a;
p.r=(360-D-b)/a;
}
else
{
p.l=(360-D-b)/a;
p.r=(D-b)/a;
}
if(p.l>=p.r)
{
p.l=0;
p.r=0;
}
if(p.l<0)
p.l=0;
if(p.r>60)
p.r=60;
return p;
}

node jiao(node a,node b)
{
node p;
p.l=max(a.l,b.l);
p.r=min(a.r,b.r);
if(p.l>=p.r) p.l=p.r=0;
return p;
}
double solve(int h,int m)
{
double a,b;
/*
时针与分针的角度处理
解方程式 D<=|hw-mw|<=360-D
hw=(h+m/60+s/3600)30
mw=(m+s/60)6
/
a=1.0/120.0-1.0/10.0;
b=30
h+m/2.0-6.0
m;
s[0][0]=interval(a,b);
s[0][1]=interval(-a,-b);
/

时针与秒针的角度处理
解方程式 D<=|hw-sw|<=360-D
hw=(h+m/60+s/3600)30
sw=s
6
/
a=1.0/120-6.0;
b=30
h+m/2.0;
s[1][0]=interval(a,b);
s[1][1]=interval(-a,-b);
/*
分针与秒针的角度处理
解方程式 D<=|mw-sw|<=360-D
mw=(m+s/3600)30
sw=s
6
/
a=0.1-6;
b=6
m;
s[2][0]=interval(a,b);
s[2][1]=interval(-a,-b);
//两个绝对值出来的区间取并集,三个并集之间取交集
node s1;
double res=0;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
{
s1=jiao(jiao(s[0][i],s[1][j]),s[2][k]);
res+=s1.r-s1.l;
}
return res;
}
int main()
{
while(scanf("%lf",&D)!=EOF)
{
if(D==-1)
break;
double ans=0;
for(int i=0;i<12;i++)
{
for(int j=0;j<60;j++)
ans+=solve(i,j);//i小时j分钟
}
printf("%.3f\n",100.0ans/(6060*12));
}
return 0;
}

posted @ 2017-01-10 13:10  王坤1993  阅读(134)  评论(0编辑  收藏  举报