• 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));
            }
        }
    }
  • 相关阅读:
    《Dive into Python》Study_Notes
    Python 各种应用收集
    Remotely disconnect a terminal services session
    stop the bibi
    SQL写法(累积)
    Django’s admin html editor — TinyMCE
    Djangobook note
    清除windows系统垃圾
    ubuntu下PDF乱码解决方法
    using的几种用法
  • 原文地址:https://www.cnblogs.com/maydow/p/4501427.html
Copyright © 2020-2023  润新知