1 条题解
-
0
解题思路
- 输入处理:
- 持续读取道路数量
n
,直到n
为-1
时结束输入。 - 对于每个道路,读取其距离
dis[i]
、绿灯时长g[i]
、黄灯时长y[i]
和红灯时长r[i]
,并计算出一个周期的总时长p[i] = g[i] + y[i] + r[i]
。
- 持续读取道路数量
- 速度测试函数
test
:test
函数接收一个速度sped
作为参数。- 对于每条道路,计算以该速度通过该道路所需的时间
t = dis[i] * 1.0 * 3600 / sped
(将距离转换为米,时间单位转换为秒)。 - 计算通过该道路的时间
t
包含的周期数times = (int)(t) / p[i]
。 - 检查剩余时间
t - times * p[i]
是否大于绿灯和黄灯时长之和g[i] + y[i]
,若大于则说明会遇到红灯,返回false
;若所有道路都不遇到红灯,则返回true
。
- 寻找可接受速度:
- 在速度范围 30 到 60 之间遍历每个速度
sped
,调用test
函数判断该速度是否可接受。如果可接受,则将canbe[sped]
标记为true
。
- 在速度范围 30 到 60 之间遍历每个速度
- 输出可接受速度范围:
- 遍历速度范围 30 到 60,根据
canbe
数组的标记情况确定可接受速度的连续范围。 - 当遇到第一个可接受速度时记录起始速度
st
,当遇到不可接受速度时记录结束速度ed
并输出该速度范围(格式为st - ed
或单个速度st
)。 - 如果最后一个速度是可接受的,也需要记录并输出其对应的速度范围。
- 如果没有可接受的速度,则输出
"No acceptable speeds."
。
- 遍历速度范围 30 到 60,根据
#include<iostream> #include<cstring> using namespace std; long double dis[6]; int n,g[6],y[6],r[6],p[6]; bool canbe[61]; bool test(int sped){ for(int i = 0; i < n; i++){ long double t = dis[i]*1.0*3600/sped; int times = (int)(t)/p[i]; if(t-times*p[i]>g[i]+y[i]) return 0; } return 1; } int main(){ int nc = 1; while(cin>>n&&n!=-1){ memset(canbe,0,sizeof(canbe)); for(int i = 0; i < n; i++){ cin >> dis[i] >> g[i] >> y[i] >> r[i]; p[i] = g[i]+y[i]+r[i]; } for(int sped = 30; sped <= 60; sped++) if(test(sped)) canbe[sped] = 1; cout << "Case " << nc++ << ": "; bool init = 1,in = 0; int st,ed,valid=0; for(int i = 30; i <= 60; i++) if(canbe[i]){ valid++; if(in==0) st = i, in = 1; } else{ if(in==1){ ed = i-1, in = 0; if(init==0) cout << ", "; init = 0; if(ed-st>0) cout << st << "-" << ed; else cout << st; } } if(in){ valid++; ed = 60; if(init==0) cout << ", "; if(ed-st>0) cout <<st << "-" << ed; else cout<< st; } if(valid==0) cout <<"No acceptable speeds."; cout << endl; } }
- 输入处理:
- 1
信息
- ID
- 311
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者