CCF 201812-2 小明放学(Java 100分)

8 篇文章 0 订阅
5 篇文章 0 订阅

文章目录

第一遍写60分,找了半天没有逻辑错误,百度之后,发现是因为int类型的问题,测试用例的数据超过了int的范围,要使用long型

1 题目

在这里插入图片描述
在这里插入图片描述

2 代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] temp = br.readLine().split(" ");
		Map<Integer, Integer> signal = new HashMap<Integer, Integer>();
		signal.put(1, Integer.parseInt(temp[0])); // 红灯
		signal.put(2, Integer.parseInt(temp[1])); // 黄灯
		signal.put(3, Integer.parseInt(temp[2])); // 绿灯

		long n = Integer.parseInt(br.readLine().split(" ")[0]);
		long totalTime = 0;
		long leftTime = 0;

		for (int i = 0; i < n; i++) {
			String[] str = br.readLine().split(" ");
			long k = Integer.parseInt(str[0]);
			long time = Integer.parseInt(str[1]);

			if (k == 0) { // 直接通行
				totalTime += time;
			}

			leftTime = totalTime % (signal.get(1) + signal.get(2) + signal.get(3)); // 只算一个周期内的

			if (k == 1) { // 出发时该点为红灯
				if (leftTime <= time) { // 到达时为红灯
					totalTime = totalTime + (time - leftTime);
				} else if (leftTime <= time + signal.get(3)) {// 到达时为绿灯
					continue;
				} else if (leftTime <= time + signal.get(3) + signal.get(2)) {// 到达时为黄灯
					totalTime = totalTime + (time + signal.get(3) + signal.get(2) - leftTime) + signal.get(1);
				} else if (leftTime <= time + signal.get(3) + signal.get(2) + signal.get(1)) {// 到达时为红灯
					totalTime = totalTime + (time + signal.get(3) + signal.get(2) + signal.get(1) - leftTime);
				}
			}

			if (k == 2) {// 出发时该点为黄灯
				if (leftTime <= time) { // 到达时为黄灯
					totalTime = totalTime + (time - leftTime) + signal.get(1);
				} else if (leftTime <= time + signal.get(1)) {// 到达时为红灯
					totalTime = totalTime + (time + signal.get(1) - leftTime);
				} else if (leftTime <= time + signal.get(1) + signal.get(3)) {// 到达时为绿灯
					continue;
				} else if (leftTime <= time + signal.get(1) + signal.get(3) + signal.get(2)) {// 到达时为黄灯
					totalTime = totalTime + (time + signal.get(1) + signal.get(3) + signal.get(2) - leftTime)
							+ signal.get(1);
				}
			}

			if (k == 3) {// 出发时该点为绿灯
				if (leftTime <= time) {// 到达时为绿灯
					continue;
				} else if (leftTime <= time + signal.get(2)) {// 到达时为黄灯
					totalTime = totalTime + (time + signal.get(2) - leftTime) + signal.get(1);
				} else if (leftTime <= time + signal.get(2) + signal.get(1)) {// 到达时为红灯
					totalTime = totalTime + (time + signal.get(2) + signal.get(1) - leftTime);
				} else if (leftTime <= time + signal.get(2) + signal.get(1) + signal.get(3)) {// 到达时为绿灯
					continue;
				}
			}
		}
		System.out.println(totalTime);
		br.close();
	}
}

官网评定
在这里插入图片描述

免费分享超过1000本计算机类电子书,包含编程语言、大数据、机器学习、校招面试经验等

(https://github.com/xiaoleetongxue/csbooks)

更多考研资料、调剂技巧可以关注我的公众号,也可以加我的微信
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
201812-2小放学的问题是关于小利用“智慧光”终端给出的信息,估算自己放学回家的时间。在这道题目中,小已经规划好了回家的路线,并能够预测经过各个路段的时间。此外,小还能够看到出发时刻路上经过的所有红绿灯的指示状态。根据题目的描述,我们可以推导出小此次回家所需要的时间。 首先,题目给出了红绿灯的设置,包括红灯、黄灯和绿灯分别需要的时间。接下来,题目给出了小经过的道路段数和路过的红绿灯数目。然后,题目给出了每个道路段和红绿灯的状态,包括经过的道路需要的时间和红绿灯的状态以及倒计时显示的数字。 根据题目的要求,我们需要不断地推演现在的时间下新经过的红绿灯状态。可以将红灯和黄灯放在一起,因为这两个状态下都得等待,然后将绿灯状态单独分开。这样就将问题简化为两个区间,即红黄和绿。通过计算每个区间所需的时间,就可以得到小放学回家所用的总时间。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [CCF 201812-2----放学----区间问题](https://blog.csdn.net/weixin_44778155/article/details/101158855)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值