HDU 1006 Tick and Tick

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值