hdoj【1006】【未完待续】

题意:
时钟的三个指针在两两之间至少D°的时候是开心的,求开心时间占一天的一个百分比。
思路:
我们看到这个百分比有三位小数,精度很高。
一天有24h,24*60min,24*60*60s,那么最小单位是秒。
换一种方法,考虑一天360*2度。但是可以看到,从秒到分到时间,这样转换到度来说,精度更高吧。
然后题目是要保证三个指针最少需要保证D°。
那么我们控制时针每个小时,使得分针最小,转动秒钟。从最小的临界条件,累加到最大的临界状态。那么考虑时间。应该也是最优精度吧。
①枚举每个小时,时针的角度=>最小分针的角度=>最小的秒钟角度,利用秒针枚举到最大的临界状态;枚举次数是24*60*60;
—————————–此时此歌:借过–印子月

后来开始打的时候发现这个D是实数,所以我们假设这个D是极端的D,小数点后6位,那么方法①貌似不行啊。所以还是到D度上来。
用角度,但是怎么枚举呢。总体的最小临界到最大临界是不变的,只是枚举方向换了。从被枚举对象秒针变成比单位度更小的单位。
然后可以看到一天的开始是0°0’0”到720°0’0”,那么就从最小的秒枚举开始,枚举次数是360*60*60,比刚刚的一天多拆分了15倍;
②:然后我直接想的就是从起点到终点中间判断一下就好了。
刚刚还卡机了。。。这个角度就是秒针的角度。
后来。。。其实把精度扩大的方法就是扩大角度的精度,我把一秒扩大1000倍,这样枚举。。。后来发现就是这样吧。。。我扩大360。。也就是枚举360*30*60*24次
—————————此时此歌:你的爱–王力宏
mdzz睡觉。神特么烦

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const double eps=1e-6;
const double pi=acos(-1.0);
const int mod=998244353;
const int INF=0x3f3f3f3f;

const int N=1e5+10;

double x[N],y[N];

int main()
{
    int i,j;
    int nn;
    int xx;
    double d;
    double sum;
    double hh,mm,ss;
    double j1,j2,j3;
    double i1,i2,i3;
    nn=100*60*60*24;
    while(~scanf("%lf",&d)){
        if(d==-1) break;
        xx=0;
        for(i=0;i<=nn;i++){
            sum=i*100;
            hh=sum/3600;
            mm=sum/60;
            ss=sum;
            hh=hh-hh/12*12;
            mm=mm-mm/60*60;
            ss=ss-ss/60*60; 
            j1=hh*30;
            j2=mm*6;
            j3=ss*6;
            i1=min(fabs(j1-j2),360-fabs(j1-j2));
            i2=min(fabs(j1-j3),360-fabs(j1-j3));
            i3=min(fabs(j2-j3),360-fabs(j2-j3));
            if(i1-d<=eps)
                continue;
            if(i2-d<=eps)
                continue;
            if(i3-d<=eps)
                continue;
            xx++;
        }
        printf("%.3lf\n",(double)xx/(double)nn*100);
    }

}
posted @ 2016-07-18 12:42  see_you_later  阅读(114)  评论(0编辑  收藏  举报