技巧总结
- 有的题目直接按照题意模拟很繁琐,有时候解题可以像解数学题目一样,数形结合,画个图总结一下变化规律,再根据规律实现代码要容易的多(题目很繁琐的时候,再向前推导一步)
解题思路
k = 0,t表示行驶路程的时间,直接累加
k = 1;t表示人在起点时,该红灯剩余的时间
k = 2;t表示人在起点时,该黄灯剩余的时间
k = 3;t表示人在起点时,该绿灯剩余的时间
可以画一个坐标图模拟过时间cnt后灯的颜色,从而计算还需等待多久
代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int r, y, g, n;
cin >> r >> y >> g >> n;
int cnt = 0; //记录从起点开始总共花费的时间
while (n --)
{
int k, t;
cin >> k >> t;
if (!k) //是路程则直接加
{
cnt += t;
continue;
}
else
{
//将t转换成坐标值
if (k == 1) t = r - t;
else if (k == 2) t = r + g + y - t;
else t = r + g - t;
//坐标上的点移动cnt的长度
t = (t + cnt) % (r + g + y);
//判断终点此时还需要等待多久才能变成绿灯
if (t >= 0 && t < r) cnt += (r - t);
else if (t >= r && t < r + g) cnt += 0;
else if (t >= r + g && t < r + g + y) cnt += (r + g + y - t) + r;
}
}
cout << cnt;
return 0;
}