hdoj-1006 TICK TICK

这道题目刚开始想到的是利用循环对每一秒进行判断,求出符合要求的秒数占总秒数的百分比。但是这样,在90度的时候总是和实例输出不一样。

后来参考了这篇博客才知道怎么回事 http://www.cnblogs.com/Lyush/archive/2011/11/29/2266925.html

原来这道题目想要考的是对连续时间的统计冰粉独立的每秒。

整个思路如下:

1先算出每根针的角速度 h,m,s

2算出每两根针的夹角速度差 h_m,h_s,s_m

3.算出没两根针角速度的变化周期 thm, ths,tsm

4.根据D,求出起始时间bsh,esh,bhm,shm,bsm,esm  公式是360/对应的变化周期

5.从起始时间开始,不断循环找符合要求的时间段

可以结合这幅图看下代码理,画的很挫,见谅哈!

这里需要注意的地方

1最好是从周期最大的到周期最小的

2.外面的用bt条件判断,否则最终会漏掉最后的部分时间

import java.util.Scanner;
public class Main {
    //角速度差
    public static double s_h=719.0/120,s_m=59.0/10,h_m=11.0/120;
    //两根针角度变化周期
    public static double tsh = 43200.0 / 719, tsm = 3600.0 / 59, tmh = 43200.0 / 11.0;
    public static double max(double a,double b,double c)
    {
        double t=a;
        if(b>t)
            t=b;
        if(c>t)
            t=c;
        return t;
    }
    public static double min(double a,double b,double c)
    {
        double t=a;
        if(b<t)
            t=b;
        if(c<t)
            t=c;
        return t;
    }
    public static void main(String[] args) {
        Scanner ss=new Scanner(System.in);
        double d=0.0;
        while ((d=ss.nextDouble())!=-1) {
            //第一次满足条件的时间
            double bsh=d/s_h;
            double esh=(360-d)/s_h;
            double bsm=d/s_m;
            double esm=(360-d)/s_m;
            double bhm=d/h_m;
            double ehm=(360-d)/h_m;
            
            double begin=0.0;
            double end=0.0;
            double total=0.0;
            for(double bt3=bsh,et3=esh; bt3<=43200.0;bt3+=tsh,et3+=tsh)
            {                    
                for(double bt2=bsm,et2=esm;bt2<=43200.0;bt2+=tsm,et2+=tsm)
                {
                    if(et2<bt3)//剔除一些不符合要求的  可以看上面的图
                        continue;
                    if(bt2>et3)
                        break;
                    for(double bt1=bhm,et1=ehm;et1<=43200.0;bt1+=tmh,et1+=tmh)
                    {
                        if(et1<bt2 || et1<bt3)
                            continue;
                        if(bt1>et2 || bt1>et3)
                            break;
                        begin=max(bt1, bt2, bt3);
                        end =min(et1, et2, et3);
                        total+=end-begin;
                    }
                }
            }
            System.out.println(String.format("%.3f", total/432));
        }
    }
}
原文地址:https://www.cnblogs.com/maydow/p/4501427.html