hdu1006 Tick and TIck
生活随笔
收集整理的這篇文章主要介紹了
hdu1006 Tick and TIck
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給定9個int,
beg1 end1 T1
beg2 end2 T2
beg3 end3 T3
三盞燈周期性亮滅,T表示燈的周期,beg,end表示燈變亮的時間和變滅的時間,beg和end都小于T。
再給定一個時間t0,問在t0時間內三盞燈同時亮著的總時間有多長。
這個問題描述起來何其簡單,可是編程難道只能模擬嗎?難道就沒有一個統一的、完美的、簡潔的數學表達式嗎?
#include<stdio.h> #include<iostream> #include<stdlib.h> #include<math.h> #include<algorithm> #include<string.h> using namespace std; double pi = acos(-1.0); //v表示三根針的角速度 double v[] = { 2 * pi / (12 * 3600), 2 * pi / (3600), 2 * pi / 60 }; //w表示三根針的相對角速度 double w[] = { v[1] - v[0], v[2] - v[0], v[2] - v[1] }; //周期長度 double T[3]; //角度開始時間和結束時間 double beg[3], over[3]; //當前三個條件是否滿足 bool flag[3]; //當前三條曲線各自的周期 int zhouqi[3]; //三條曲線的下一時間 double nex[3]; int main(){ freopen("in.txt", "r", stdin);for (int i = 0; i < 3; i++){T[i] = 2 * pi / w[i];}double x;while (cin >> x&&x != -1){x = x / 180 * pi;double ans = 0;for (int i = 0; i < 3; i++){beg[i] = x / w[i];over[i] = T[i] - beg[i];nex[i] = beg[i];}memset(flag, 0, sizeof(flag));memset(zhouqi, 0, sizeof(zhouqi));double t = 0;while (true){int mi = 0;for (int i = 1; i < 3; i++){if (nex[i] < nex[mi]){mi = i;}}double next_t = min(nex[mi], 12.0 * 3600);if (flag[0] && flag[1] && flag[2]){ans += next_t - t;}t = next_t;if (t >= 12 * 3600)break;if (flag[mi]){flag[mi] = false;zhouqi[mi]++;nex[mi] = beg[mi] + zhouqi[mi] * T[mi];}else{flag[mi] = true;nex[mi] = over[mi] + zhouqi[mi] * T[mi];}}printf("%.3lf\n", ans /12/36);}return 0; }總結
以上是生活随笔為你收集整理的hdu1006 Tick and TIck的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL基础整理——例题
- 下一篇: Android 优秀博客汇总