1. 程式人生 > >HDU 1006 Tick and Tick(時鐘,分鐘,秒鐘角度問題)

HDU 1006 Tick and Tick(時鐘,分鐘,秒鐘角度問題)

c++ for each 垃圾 script con names clock his ike

傳送門:

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


Problem Description The three hands of the clock are rotating every second and meeting each other many times everyday. Finally, they get bored of this and each of them would like to stay away from the other two. A hand is happy if it is at least D degrees from any of the rest. You are to calculate how much time in a day that all the hands are happy.

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.

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 Input 0 120 90 -1

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>
using
namespace 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(時鐘,分鐘,秒鐘角度問題)