一开始已离散的方式求解,第三个样例过不了,代码如下: #include<iostream> using namespace std; double delta(double a,double b){ double tmp; if(a<b){tmp=a;a=b;b=tmp;} a=a-b; if(a>180.0) a=360.0-a; return a; } int main() { double D; while(scanf("%lf",&D)){ if(D==-1) break; int s; int total=12*60*60; double deS,deM,deH; int ret=0; for(s=0;s<total;s++){ int ss=s%60; deS=ss*6.0; /* the degree of second hand*/ deM=(((s/60)%60)*1.0+((s%60)/60.0))*6.0; deH=((s/3600)*1.0+((s%3600)/3600.0))*30.0; if(delta(deS,deM)<D||delta(deS,deH)<D||delta(deM,deH)<D) continue; ret++; } printf("%.3lf/n",ret*1.0/(total*1.0)*100.0); } } 应该以连续的方式求解,代码如下: #include<iostream> #include<algorithm> using namespace std; double num[15]; int hash[15]; void extenal(double a,double b){ double start,end; start=0;end=a; int i; for(i=0;i<13;i++) if(start<=num[i]&&end>=num[i+1]) hash[i]++; start=b;end=60; for(i=0;i<13;i++) if(start<=num[i]&&end>=num[i+1]) hash[i]++; return ; } void intenal(double a,double b){ double start,end; start=a;end=b; int i; for(i=0;i<13;i++) if(start<=num[i]&&end>=num[i+1]) hash[i]++; return ; } double process(double ms,double hs,double D){ double ret=0; /* 第一个不等式 D<=|6t-(ms+t)/10|<=360-D */ double sa,sb,sc,sd; sa=(ms-D*10)/59; sb=(ms+D*10)/59; sc=(ms-3600+10*D)/59; sd=(ms+3600-10*D)/59; /* 第二个不等式 D<=|6t-(hs+t)/120|<=360-D */ double ma,mb,mc,md; ma=(hs-D*120)/719; mb=(hs+D*120)/719; mc=(hs-43200+120*D)/719; md=(hs+43200-D*120)/719; /* 第三个不等式 D<=|(ms+t)/10-(hs+t)/120|<=360-D */ double ha,hb,hc,hd; ha=(hs-12*ms-120*D)/11; hb=(hs-12*ms+120*D)/11; hc=(hs-12*ms-43200+120*D)/11; hd=(hs-12*ms+43200-120*D)/11; num[0]=0; num[1]=60; num[2]=sa; num[3]=sb; num[4]=sc; num[5]=sd; num[6]=ma; num[7]=mb; num[8]=mc; num[9]=md; num[10]=ha; num[11]=hb; num[12]=hc; num[13]=hd; sort(num,num+14); memset(hash,0,sizeof(hash)); extenal(sa,sb); extenal(ma,mb); extenal(ha,hb); intenal(sc,sd); intenal(mc,md); intenal(hc,hd); int i; for(i=0;i<13;i++) if(hash[i]>=6) ret+=num[i+1]-num[i]; return ret; } int main() { double D; while(scanf("%lf",&D)){ if(D==-1) break; double sum=0; int i; int start=0; for(i=0;i<720;i++){ sum+=process(start%3600,start,D); start+=60; } printf("%.3lf/n",sum*100.0/43200.0); } }