您的位置:首页 > 其它

[HDU 1006] Tick and Tick 模拟题

2015-07-23 15:36 357 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1006

题意:给你一个角度n,要你求一天内三个指针角度差都大于n的时间占总时间的百分百

第一次写的时候以为是按秒来算的,写完后发现精度不够,然后再别人博客上看到要用角速度来算。

思路:求出每两个指针的相对角速度(两个指针夹角变化的速度),求出相对周期(可以理解为两个指针第一次重合和第二次重合的时间差),求出每两个指针满足角度关系的时间范围,最后求出交集就好了。

[code]#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

const double s_m = 59.0/10.0, s_h = 719.0/120.0, m_h = 11.0/120.0;//相对角速度
const double t_sm = 3600.0/59.0, t_sh = 43200.0/719.0, t_mh = 43200.0/11.0;//相对周期

int main()
{
    int n;
    double st[3], et[3];
    while(~scanf("%d", &n) && ~n){
        st[0] = n / s_m; st[1] = n / s_h; st[2] = n / m_h; //满足条件的起始时间
        et[0] = (360 - n) / s_m; et[1] = (360 - n) / s_h; et[2] = (360 - n) / m_h;//满足条件的终止时间
        double sum = 0;
        double si[3], ti[3];
        //分别求每个相对周期的交集
        for(si[0] = st[0], ti[0] = et[0];  ti[0] <= 43200.00001; si[0] += t_sm, ti[0] += t_sm){
            for(si[1] = st[1], ti[1] = et[1];  ti[1] <= 43200.00001; si[1] += t_sh, ti[1] += t_sh){
                if(ti[0] < si[1])
                    break;
                if(si[0] > ti[1])
                    continue;
                for(si[2] = st[2],ti[2] = et[2];ti[2] <= 43200.00001;si[2] += t_mh, ti[2] += t_mh){
                    if(ti[0] < si[2] || ti[1] < si[2])
                        break;
                    if(si[0] > ti[2] || si[1] > ti[2])
                        continue;
                    double bi = max(si[0], max(si[1], si[2]));
                    double ed = min(ti[0], min(ti[1], ti[2]));
                    if(ed > bi)
                        sum += ed - bi;
                }
            }
        }
        printf("%.3lf\n", sum/432.0);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: