hdoj【1006】【未完待续】

来源:互联网 发布:ebrary电子书数据库 编辑:程序博客网 时间:2024/05/17 23:05

题意:
时钟的三个指针在两两之间至少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);    }}
0 0
原创粉丝点击