HDU 1006 Tick and Tick(時鐘,分鐘,秒鐘角度問題)
阿新 • • 發佈:2018-07-15
c++ for each 垃圾 script con names clock his ike
Input
The input contains many test cases. Each of them has a single line with a real number D between 0 and 120, inclusively. The input is terminated with a D of -1.
Sample Input
0
120
90
-1
傳送門:
http://acm.hdu.edu.cn/showproblem.php?pid=1006
Tick and Tick
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 22203 Accepted Submission(s): 5877
Output For each D, print in a single line the percentage of time in a day that all of the hands are happy, accurate up to 3 decimal places.
Sample Output 100.000 0.000 6.251
Author PAN, Minghao
Source ZJCPC2004 題意:時針,分針和秒針都厭倦了其余兩針,只有在與其余兩針保持n度以上的距離才能感到高興。問一天中,三針都高興的時間占總時間的百分比。註意時間是連續的。 分析: 時間是連續的,不能枚舉。。我一開始就去枚舉。。。 推薦一個大神的題解:(我的太垃圾) https://blog.csdn.net/a601025382s/article/details/37814777(看了大神博客就懂了) 不要臉的貼一下代碼:
#include<bits/stdc++.h> usingnamespace std; typedef long long ll; #define max_v 10000 int main() { int t; double n,sum,ft1,ft2,ft3,et1,et2,et3,max,min; double sm,sh,mh,tsm,tsh,tmh,fsm,fsh,fmh,esm,esh,emh; sm=10./59.; sh=120./719.; mh=120./11.; tsm=360*sm; tsh=360*sh; tmh=360*mh; while(~scanf("%lf",&n)) { if(n<0) break; sum=0; fsm=sm*n; fsh=sh*n; fmh=mh*n; esm=tsm-fsm; esh=tsh-fsh; emh=tmh-fmh; for(ft3=fmh,et3=emh;et3<=43200;et3+=tmh,ft3+=tmh) { for(ft2=fsh,et2=esh;et2<=43200;et2+=tsh,ft2+=tsh) { if(et2<ft3) continue; if(ft2>et3) break; for(t=0,ft1=fsm,et1=esm;et1<=43200;t=t+1,et1=esm+t*tsm,ft1=fsm+t*tsm) { if(et1<ft3 || et1<ft2) continue; if(ft1>et3 || ft1>et2) break; max=ft1; if(ft2>max) max=ft2; if(ft3>max) max=ft3; min=et1; if(et2<min) min=et2; if(et3<min) min=et3; sum+=min-max; } } } sum/=432.; printf("%.3lf\n",sum); } return 0; }
HDU 1006 Tick and Tick(時鐘,分鐘,秒鐘角度問題)