JAVA CCF-201812-2 小明放学

欢迎访问我的CCF认证解题目录


题目描述

在这里插入图片描述


思路过程

  • 题目给的灯都是小明出发时的状况,所以对于每个灯我们还得自己计算到达时的状态。
  • 新建一个sum变量来累计时间,由于极端情况下int会数据溢出,所以得采用Long类型。
  • 新建一个变量x,存储红绿灯一轮所需的时间。
  • 开始读入数据,如果是路,则直接 sum += time;
  • 这一步配合下面的图进行观看容易理解一些。如果不是路,我们计算出这一轮剩余的时间(脑子里有一个循环的红绿灯时间轴,以绿灯为起点,红灯为终点,无限循环),然后加上sum再对x取余,即可得到这一轮已经经过的时间,最后进行判断,如果此时不是绿灯,则加上所需的时间即可。
红绿灯的时间轴
x <-------------------------0
| 红灯 | 黄灯 | 绿灯 |
  • 如果没看懂欢迎评论,看到后会马上回复。

代码

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);
    }
}
发布了60 篇原创文章 · 获赞 0 · 访问量 2110

猜你喜欢

转载自blog.csdn.net/weixin_43732798/article/details/104266934