钟表问题解决思路:
以秒针的转动的角度, 计算分针与时针转过的角度。 即: 模拟现实的场景。
《1》
#include#include #include #include using namespace std;vector v[5000000];void Print(int x){ printf("%02d:%02d:%02d\n", x/3600, x/60%60, x%60);}int MOD(long long x){ x%=12000*360; if(x<0) x+=12000*360; if(x>12000*180) x=12000*360-x; return x;}void solve(){ long long h = 0; long long m = 0; for(int i=0; i<12*60*60; i+=10) { v[MOD(h-m)].push_back(i); h+=1000;//十秒钟, 时针走过的角度(放大的) m+=12000; }}int main(){ solve(); int x; while(scanf("%d", &x)!=EOF) { for(int i=0; i
看到另一种精简的解法:
#include#include #include using namespace std;int main(){ int x; while(cin>>x) { for(int h=0; h<12; ++h) for(int m=0; m<60; ++m) for(int s=0; s<60; s+=10) { int a1=h*360000+m*6000+s*100; int a2=m*72000+s*1200; if(min(abs(a1-a2),360*12000-abs(a1-a2))==x) printf("%02d:%02d:%02d\n",h,m,s); } } return 0;}
《2》
#include#include #include #include using namespace std;const int MAXN = 12*60*60;double hm, hs, ms, T_hm, T_hs, T_ms;void init(){ double h, m, s; h=1.0/120; m=1.0/10; s=6; hm=m-h; hs=s-h; ms=s-m; T_hm=360/hm; T_hs=360/hs; T_ms=360/ms;}double Max(double a, double b, double c){ return max(max(a, b), c);}double Min(double a, double b, double c){ return min(min(a, b), c);}int main(){ init(); double n; while(scanf("%lf", &n)!=EOF) { if(n<0) break; double i, j, k, a[6], p, q, ans = 0; a[0]=n/hm; a[1]=n/hs; a[2]=n/ms; a[3]=(360-n)/hm; a[4]=(360-n)/hs; a[5]=(360-n)/ms; for(i=0; i<=1.0*MAXN; i+=T_hm) { for(j=0; j<=1.0*MAXN; j+=T_hs) { if(j+a[1]>i+a[3]) break; if(i+a[0]>j+a[4]) continue; for(k=0; k<=1.0*MAXN; k+=T_ms) { if(k+a[2]>i+a[3]||k+a[2]>j+a[4])break; if(i+a[0]>k+a[5]||j+a[1]>k+a[5])continue; p=Max(i+a[0],j+a[1],k+a[2]);//在这三个时间段刚好完成分离n度,所以取最大值才能保证全都分离n以上 q=Min(i+a[3],j+a[4],k+a[5]);//在这三个时间段刚好完成合并n度,所以取最小值才能保证全都未合并到n以内 if(q>p) ans+=q-p; } } } printf("%.3lf\n", 100.0*ans/MAXN); } return 0;}