欢迎访问我的CCF认证解题目录
题目描述
思路过程
- 题目给的灯都是小明出发时的状况,所以对于每个灯我们还得自己计算到达时的状态。
- 新建一个sum变量来累计时间,由于极端情况下int会数据溢出,所以得采用Long类型。
- 新建一个变量x,存储红绿灯一轮所需的时间。
- 开始读入数据,如果是路,则直接 sum += time;
- 这一步配合下面的图进行观看容易理解一些。如果不是路,我们计算出这一轮剩余的时间(脑子里有一个循环的红绿灯时间轴,以绿灯为起点,红灯为终点,无限循环),然后加上sum再对x取余,即可得到这一轮已经经过的时间,最后进行判断,如果此时不是绿灯,则加上所需的时间即可。
- 如果没看懂欢迎评论,看到后会马上回复。
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int r = in.nextInt(), y = in.nextInt(), g = in.nextInt(), n = in.nextInt();//分别对应三个灯的时长
int x = r+y+g;//三个灯的总时长
long sum = 0;//经过的时间,可能会超出int的存储范围
for ( int i = 0; i < n; i++ ) {
int type = in.nextInt(), time = in.nextInt();//灯的类型和倒计时
long temp = 0;
if ( type == 0 ) {//如果是路时,则直接加
sum += time;
} else {
switch ( type ) {
case 1: temp = (sum+x-time)%x; break;//红灯
case 2: temp = (sum+y+g-time)%x; break;//黄灯
case 3: temp = (sum+g-time)%x; break;//绿灯
}
if ( temp > g ) sum = sum+x-temp;//如果此时不是绿灯
}
}
System.out.println(sum);
}
}