思路一:按秒数1s1s遍历43200秒,对满足条件的秒数进行统计
结果:答案错误,问题在于原题是连续时间(角度连续变化)的,用离散的方法肯定不行。
思路二:参考网上的解法,使用角速度相减算周期的方法
具体参考 https://blog.youkuaiyun.com/sinat_18897273/article/details/71191038的解法。
结果:顺利AC。提醒:需要将所有数据设置为double类型,设置为float类型在最后一位数上会有错误,心累。
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
double max(double a,double b,double c){
double result = a>b?a:b;
result = result>c?result:c;
return result;
}
double min(double a,double b,double c){
double result = a<b?a:b;
result = result<c?result:c;
return result;
}
int main(){
double angle;
while(cin>>angle&&angle!=-1){
double vsh,vsm,vmh,tsh,tsm,tmh,start,end,total=0;
vsm = 6.-1./10.;vsh = 6.0-1./120.;vmh = 1./10.-1./120.;
tsm = 360.0/vsm;tsh = 360.0/vsh;tmh = 360.0/vmh;
double bsh,esh,bsm,esm,bmh,emh;
bsh = angle/vsh;esh = (360.-angle)/vsh;
bsm = angle/vsm;esm = (360.-angle)/vsm;
bmh = angle/vmh;emh = (360.-angle)/vmh;
while(bmh<43200){
while(bsm<emh){
while(bsh<emh&&bsh<esm){
start = max(bsh,bsm,bmh);
end = min(esh,esm,emh);
total += (end-start)>0?(end-start):0;
bsh = bsh+tsh;esh = esh+tsh;
}
bsh = bsh-tsh;esh = esh-tsh;
bsm = bsm+tsm;esm = esm+tsm;
}
bsm = bsm-tsm;esm = esm-tsm;
bmh = bmh+tmh;emh = emh+tmh;
}
cout<<fixed<<setprecision(3)<<total/432<<endl;}
return 0;
}