1 条题解
-
0
说明
该程序用于计算多个交通信号灯在初始同时变为绿灯后,再次同时显示绿灯的最短时间。每个信号灯的周期包括绿灯、黄灯和红灯时间,程序需要找到所有信号灯周期的最小公倍数,确保它们在某一时刻再次同时显示绿灯。
算法标签
- 数学计算
- 最小公倍数
- 时间处理
解题思路
- 问题分析:每个信号灯的周期为
T
秒,其中绿灯时间为T - 5
秒,黄灯时间为5秒。程序需要找到一个时间点t
,使得对于所有信号灯,t
处于它们的绿灯周期内。 - 输入处理:读取每个场景的信号灯周期,直到遇到
0
结束场景,整个输入以000
结束。 - 时间计算:
- 对于每个场景,计算所有信号灯周期的最小公倍数(LCM)。
- 检查是否存在一个时间
t
(不超过5小时),使得t
满足所有信号灯同时处于绿灯周期。
- 输出结果:如果找到满足条件的
t
,则格式化输出小时、分钟和秒;否则输出超时信息。
分析
- 周期处理:每个信号灯的绿灯周期为
T - 5
秒,黄灯和红灯周期为T
秒。 - 最小公倍数:计算所有信号灯周期的最小公倍数,确保它们在同一时间点再次同时显示绿灯。
- 时间限制:检查计算出的时间是否在5小时(18000秒)内。
实现步骤
- 读取输入:循环读取每个场景的信号灯周期,直到遇到
0
结束场景。 - 计算最小公倍数:对于每个场景的信号灯周期,计算它们的最小公倍数。
- 检查时间限制:确保计算出的时间不超过5小时。
- 格式化输出:将时间转换为小时、分钟和秒的格式输出,或输出超时信息。
代码解释
- 输入处理:使用
scanf
读取信号灯周期,存储在cycles
中,直到遇到0
结束场景。 - 最小公倍数计算:遍历所有周期,计算它们的最小公倍数。
- 时间检查:确保计算出的时间
t
不超过5小时(18000秒)。 - 结果输出:如果找到满足条件的
t
,则格式化为HH:MM:SS
输出;否则输出超时信息。
该程序通过数学计算和有效的时间处理,解决了交通信号灯同步的问题,适用于类似周期性事件的同步计算。
代码:
/* UVA161 POJ1211 Traffic Lights */ #include <iostream> #include <map> #include <cstdio> #include <climits> using namespace std; const int N = 3600 * 5; int main() { int x; for(;;) { scanf("%d", &x); if(x == 0) break; map<int, int> cycles; map<int, int>::iterator iter; int cnt = 0, minx = 1e9 + 1; while(x) { cnt++; minx = min(minx, x); cycles[x] = 1; scanf("%d", &x); } if(cnt >= 2) { int i; for(i = minx - 5; i <= N; i++) { for(iter = cycles.begin(); iter != cycles.end(); iter++) { int tmp = (i / (2 * iter->first)) * (2 * iter->first); if(i >= tmp + iter->first - 5) break; } if(iter == cycles.end()) { int h = i / 3600; i %= 3600; int m = i / 60; int s = i % 60; printf("%02d:%02d:%02d\n", h, m, s); break; } } if(i > N) printf("Signals fail to synchronise in 5 hours\n"); } } return 0; }
- 1
信息
- ID
- 212
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者