zoukankan      html  css  js  c++  java
  • HDU 1006 模拟

    Tick and Tick

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 20120    Accepted Submission(s): 5262


    Problem Description
    The three hands of the clock are rotating every second and meeting each other many times everyday. Finally, they get bored of this and each of them would like to stay away from the other two. A hand is happy if it is at least D degrees from any of the rest. You are to calculate how much time in a day that all the hands are happy.
     
    Input
    The input contains many test cases. Each of them has a single line with a real number D between 0 and 120, inclusively. The input is terminated with a D of -1.
     
    Output
    For each D, print in a single line the percentage of time in a day that all of the hands are happy, accurate up to 3 decimal places.
     
    Sample Input
    0 120 90 -1
     
    Sample Output
    100.000 0.000 6.251
     
    Author
    PAN, Minghao
     
    Source
    分析:

    三个指针走的角速度:

    秒针速度S = 6°/s,分针速度M = (1/10)°/s,时针速度H = (1/120)°/s

    这三个指针两两之间的相对速度差为:

    秒时相差S_H = (719/120)°/s,秒分相差S_M = (59/10)°/s,分时相差M_H = (120/11)°/s

    相差一度需要的时间为

    秒时相差SH = (120/719)s/度,秒分相差SM = (10/59)s/度,分时相差MH = (120/11)s/度

    相差360°需要的时间为

    秒时相差tSH = 43200.0/719,秒分相差tSM = 3600.0/59,分时相差tMH = 43200.0/11

    算出两两指针在43200s(12小时)内满足条件时间的区间的交集。

     代码:

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<iostream>

    using namespace std;
    ///秒针角速度 6度/s, 分针0.1度/s,时针1/120度/s
    const double sh = 719.0/120 , sm = 59.0/10, mh = 11.0/120;///三个指针两两相对角速度。
    const double tsh = 43200.0 / 719, tsm = 3600.0 / 59, tmh = 43200.0 / 11;///三个指针两两相差360度所需的时间。
    ///将相对角速度变成周期。(即两针间需要多久出现夹角的循环)
    /// 同样可求得三个周期的最小公倍数为 43200 秒,即12小时,

    double max1(double a, double b, double c)
    {
    return max(a, max(b, c));
    }
    double min1(double a, double b, double c)
    {
    return min(a, min(b, c));
    }
    int main(void)
    {
    int D;

    while(scanf("%d", &D), D != -1)
    {
    double bsh, bsm, bmh, esh, esm, emh, total, beginn, endd;
    ///第一次满足条件的时间。(开始时间)
    bsh = D / sh;
    bsm = D / sm;
    bmh = D / mh;
    ///第一次出现不满足条件的时间。(结束时间)
    esh = (360 - D) / sh;
    esm = (360 - D) / sm;
    emh = (360 - D) / mh;


    total = 0;

    for(double bt1 = bsh, et1 = esh; et1<= 43200.000001; bt1 += tsh, et1 += tsh)
    {
    for(double bt2 = bsm, et2 = esm; et2 <= 43200.000001; bt2 += tsm, et2 += tsm)
    {
    ///判断是否有交集。
    if(bt2 > et1)
    break;

    if(et2 < bt1)
    continue;

    for(double bt3 = bmh, et3 = emh; et3 <= 43200.000001; bt3 += tmh, et3 += tmh)
    {
    if(bt3 > et1 || bt3 > et2)
    break;

    if(et3 < bt1 || et3 < bt2)
    continue;

    beginn = max1(bt1, bt2, bt3);
    endd = min1(et1, et2, et3);

    total += (endd - beginn);
    }

    }
    }

    printf("%.3f ", total / 432);

    }
    return 0;
    }

  • 相关阅读:
    2015生命之旅---第三站象山之行
    我的八年程序之路(四)程序路上的新起点
    2015生命之旅---第二站长沙杭州
    2015生命之旅---第一站重庆
    我的八年程序之路(三)为了理想放弃高薪
    锋友分享:国行和非国行iPhone的送修需知
    iPhone被盗后续更新二:被换机!已取机!没扣住新机!怎么找新机呢?事发半年后跟进...
    iPhone被盗后续更新一:怎么找老机
    iPhone被盗后怎么?这篇文章只办针对iOS7后的系统
    四个小诀窍 告诉你雪景怎么拍才能更好看
  • 原文地址:https://www.cnblogs.com/dll6/p/7799595.html
Copyright © 2011-2022 走看看