您的位置:首页 > 其它

HDU 1006 Tick and Tick

2016-08-11 20:42 363 查看
    这道题......感觉就是一道计算题了= =知道怎么算的能算出来就好了,不过一开始低估这个题了,把钟表想的是时针不动让分针先动一圈......好吧,那样太简单了,然后就开始算角速度,表示算了一张纸才把等式什么的捋清楚......不过最后还是没做出来= =不小心当成一个小时时针分针秒针相遇了,所以......这题弄了一天最后还是没弄出来,最后看的DISCUSS里的代码,才发现了这点错误,然后才修改过来(好吧,其实是大幅度的修改,因为代码少了个因素表示除了一开始列的式子全都改了= =).......

    先发一下DISCUSS的代码链接:http://acm.hdu.edu.cn/discuss/problem/post/reply.php?postid=4499&messageid=1&deep=0

    额,具体这个怎么算貌似DISCUSS里面0o恋蓝o0 大神分析的也很清楚了......直接贴代码吧。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const double vh=1.0/120.0,vm=0.1,vs=6.0;

double tmax(double a,double b,double c)
{
double t;
t=a>b?a:b;
if(t>c)
return t;
else
return c;
}

double tmin(double a,double b,double c)
{
double t;
t=a<b?a:b;
if(t<c)
return t;
else
return c;
}

int main()
{
double n,sum,s,e,ans;
double tsm,tsh,tmh,ssm,ssh,smh,esm,esh,emh;
double st1,st2,st3,et1,et2,et3;
int i;
while(scanf("%lf",&n)!=EOF)
{
if(n==-1)
break;
sum=0.0;
tsm=360.0/(vs-vm);
tsh=360.0/(vs-vh);
tmh=360.0/(vm-vh);
//相遇时间
ssm=n/(vs-vm);
ssh=n/(vs-vh);
smh=n/(vm-vh);
esm=360.0/(vs-vm)-ssm;
esh=360.0/(vs-vh)-ssh;
emh=360.0/(vm-vh)-smh;
for(st3=smh,et3=emh;et3<=43200;st3=st3+tmh,et3=et3+tmh)
{
for(st2=ssh,et2=esh;et2<=43200;st2=st2+tsh,et2=et2+tsh)
{
if(et2<st3)
continue;
if(st2>et3)
break;
//如果时间的区间不相重合
for(i=0,st1=ssm,et1=esm;et1<=43200;++i,st1=ssm+(double)i*tsm,et1=esm+(double)i*tsm)
{
if(et1<st3||et1<st2)
continue;
if(st1>et3||st1>et2)
break;
s=tmax(st1,st2,st3);
e=tmin(et1,et2,et3);
sum=sum+e-s;
}
}
}
ans=sum/432.0;
printf("%.3f\n",ans);
}
return 0;
}


之前错的就不贴了.......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: