先给链接:杭电 1006
题目大意:
指针有一个快乐时间,就是时钟上三个针所形成的角度大于输入的D的时候,求一天内快乐时间所占的比例。
题目思路:
首先想到的是有没有公式,然而并没有得到公式,所以采取模拟的思路
贴代码:
#include <cstdio>
using namespace std;
double max1(double a,double b,double c){
if(a<b) a=b;
if(a<c) a=c;
return a;
}
double min1(double a,double b,double c){
if(a>b) a=b;
if(a>c) a=c;
return a;
}
inline bool equal1(double a,double b){
if((a-b)>-0.0000001&&(a-b)<0.0000001) return true;
else return false;
}
int main(){
double sum=0.0,d,newx,newy;
double mh=43200.0000/11;
double sm=3600.0000/59;
double sh=43200.0000/719;
double dsm,dsh,dmh,tdsm,tdsh,tdmh;
while(scanf("%lf",&d)&&d!=-1){
sum=0.0;
dsm=10.0*d/59.0;tdsm=sm-dsm;
dsh=120.0*d/719.0;tdsh=sh-dsh;
dmh=120.0*d/11.0;tdmh=mh-dmh;
newx=max1(dsm,dsh,dmh); newy=min1(tdsm,tdsh,tdmh);
while(newx<=43200&&newy<=43200){
newx=max1(dsm,dsh,dmh);
newy=min1(tdsm,tdsh,tdmh);
if(newx<newy) sum+=newy-newx;
if(newy==tdsm) {dsm+=sm;tdsm+=sm;}
else if(newy==tdsh){dsh+=sh;tdsh+=sh;}
else if(newy==tdmh){dmh+=mh;tdmh+=mh;}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>printf("%.3lf\n",sum/432);
}
return 0;
}
(吐槽:这个题不想再做第二遍了,快吐了)
注意事项:
尽量少用double的乘除法,会增加耗时
题目精髓在于求出三个指针的相遇周期