hdoj-1006-c++

本文介绍了一种计算秒针、分针与时针在一天内形成特定角度的概率的算法。采用角速度差和周期计算的方法,通过精确计算得出正确结果。注意使用double而非float类型确保精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路一:按秒数1s1s遍历43200秒,对满足条件的秒数进行统计

结果:答案错误,问题在于原题是连续时间(角度连续变化)的,用离散的方法肯定不行。

思路二:参考网上的解法,使用角速度相减算周期的方法

具体参考 https://blog.youkuaiyun.com/sinat_18897273/article/details/71191038的解法。

结果:顺利AC。提醒:需要将所有数据设置为double类型,设置为float类型在最后一位数上会有错误,心累。

#include <iostream>

#include <algorithm>

#include <iomanip>

using namespace std;


double max(double a,double b,double c){

    double result = a>b?a:b;

    result = result>c?result:c;

    return result;

}


double min(double a,double b,double c){

    double result = a<b?a:b;

    result = result<c?result:c;

    return result;

}


int main(){

    double angle;

    while(cin>>angle&&angle!=-1){

    double vsh,vsm,vmh,tsh,tsm,tmh,start,end,total=0;

    vsm = 6.-1./10.;vsh = 6.0-1./120.;vmh = 1./10.-1./120.;

    tsm = 360.0/vsm;tsh = 360.0/vsh;tmh = 360.0/vmh;

    double bsh,esh,bsm,esm,bmh,emh;

    bsh = angle/vsh;esh = (360.-angle)/vsh;

    bsm = angle/vsm;esm = (360.-angle)/vsm;

    bmh = angle/vmh;emh = (360.-angle)/vmh;

    while(bmh<43200){

        while(bsm<emh){

            while(bsh<emh&&bsh<esm){

                start = max(bsh,bsm,bmh);

                end = min(esh,esm,emh);

                total += (end-start)>0?(end-start):0;

                bsh = bsh+tsh;esh = esh+tsh;

            }

            bsh = bsh-tsh;esh = esh-tsh;

            bsm = bsm+tsm;esm = esm+tsm;

        }

        bsm = bsm-tsm;esm = esm-tsm;

        bmh = bmh+tmh;emh = emh+tmh;

    }

        cout<<fixed<<setprecision(3)<<total/432<<endl;}

    return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值