HDU 1006 Tick and Tick

来源:互联网 发布:淘宝冲销量网站 编辑:程序博客网 时间:2024/05/21 07:26

    这道题......感觉就是一道计算题了= =知道怎么算的能算出来就好了,不过一开始低估这个题了,把钟表想的是时针不动让分针先动一圈......好吧,那样太简单了,然后就开始算角速度,表示算了一张纸才把等式什么的捋清楚......不过最后还是没做出来= =不小心当成一个小时时针分针秒针相遇了,所以......这题弄了一天最后还是没弄出来,最后看的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;}

之前错的就不贴了.......

0 0