CCF认证2018122-小明放学

本文探讨了在动态变化的红绿灯环境下,如何准确计算小明在行驶过程中的红绿灯状态及通过时间。利用红绿灯周期性特点,通过计算到达路口时红绿灯的工作时间,判断灯色并计算通过时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本人初学,水平有限,若有不足,恳请赐教!

上学问题不同,这里每个路口的状态都是相对于小明离开学校的初始时刻的状态。因此在小明的整个行驶过程中,每个路口的状态也都是动态变化的。因此问题的关键就是要正确地计算小明在行驶到某一个路口时此路口灯的颜色和持续时间。

由于红绿灯的顺序和持续时间存在周期性,故可利用此性质计算小明在到达某个路口时红绿灯的状态。首先,计算整个红绿灯的周期x=r+g+y。不妨令这个周期从红灯开始,则根据顺序可以知道当时间分别在[0,r)、[r,r+g)和[r+g,r+g+y)中时分别表示红绿灯处于红灯、绿灯和黄灯的状态。然后,计算如果此路口初始记录的灯为红、绿和黄则在到达此路口时路灯相对于整个周期工作了多少时间。接着,根据对周期x的取模结果判断其处于[0,r)、[r,r+g)和[r+g,r+g+y)中的哪个时段,从而判断此时灯的颜色。最后,根据上学问题得到的规律来计算通过此路口的时间。

注意:与上学问题不同,放学问题对于数据量的要求更大,因此如果使用int类型存放变量和结果会报错!

具体代码如下:

#include <iostream>

using namespace std;

int main()
{
	long long r, y, g;
	cin >> r >> y >> g;
	long long x = r + y + g; //取红绿灯周期为x
	long long n;
	cin >> n;
	long long sum = 0;
	for(int i = 0; i < n; i++)
	{
		long long k, t;
		cin >> k >> t;
		//假设每个周期的顺序为红、绿、黄,nr、ng和ny分别表示如果此路口初始记录的灯为红、绿和黄
		//则在到达此路口时路灯相对于整个周期工作了多少时间
		//在switch语句中这3个变量至多用到其中一个
		long long nr = (r - t + sum) % x;
		long long ng = (r + g - t + sum) % x;
		long long ny = (r + g + y - t + sum) % x;
		switch(k)
		{
		case 0: //无红绿灯
			sum += t; break;
		case 1: //红灯
			if(0 <= nr && nr < r)
				sum += r - nr;
			else if(r <= nr && nr < r + g)
				sum += 0;
			else
				sum += y - (nr - r - g) + r;
			break;
		case 2: //黄灯
			if(0 <= ny && ny < r)
				sum += r - ny;
			else if(r <= ny && ny < r + g)
				sum += 0;
			else
				sum += y - (ny - r - g) + r;
			break;
		case 3: //绿灯
			if(0 <= ng && ng < r)
				sum += r - ng;
			else if(r <= ng && ng < r + g)
				sum += 0;
			else
				sum += y - (ng - r - g) + r;
		default:break;
		}
	}
	cout << sum;
	return 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.youkuaiyun.com/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、付费专栏及课程。

余额充值