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);
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值