CCF认证 2018-12 02小明放学

本文详细解析了一个关于红绿灯动态时间调整的算法,通过取余操作判断车辆到达红绿灯时所需等待的时间,并根据不同颜色灯的情况进行具体计算,以实现动态调整红绿灯时间的目的。

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

在这里插入图片描述

#include <iostream>
using namespace std;

int r, y, g;
int n;
int k;
int t;
long long sum = 0;
int sum1 = 0;

int main(){
	cin >> r >> y >> g;
	cin >> n;
	while(n){
		cin >> k >> t;
		if(k == 0){
			sum += t;
		}
		else if(k == 1){
			sum1 = sum % (r+g+y);
			if(sum1 < t){
				sum += t - sum1;
			}
			else if(sum1 >= t && (sum1 < t+g)){
				;
			}
			else if(sum1 >= t+g && sum1 < t+g+y){
				sum += t+g+y-sum1+r;
			}
			else if(sum1 >= t+g+y && sum1 < r+g+y){
				sum += r+g+y+t-sum1;
			}
		}
		else if(k == 2){
			sum1 = sum % (r+g+y);
			if(sum1 < t){
				sum += t-sum1+r;
			}
			else if(sum1 >= t && sum1 < t+r){
				sum += t+r-sum1;
			}
			else if(sum1 >= t+r && sum1 < t+r+g){
				;
			}
			else if(sum1 >= t+r+g && sum1 < r+g+y){
				sum += r+g+y+t-sum1+r;
			}
		}
		else if(k == 3){
			sum1 = sum % (r+g+y);
			if(sum1 < t){
				;
			}
			else if(sum1 >= t && sum1 < t+y){
				sum += t+y-sum1+r;
			}
			else if(sum1 >= t+y && sum1 < t+r+y){
				sum += t+r+y-sum1;
			}
			else if(sum1 >= t+r+y && sum1 < r+g+y){
				;
			}
		}
		n--;
	}
	cout << sum;
	return 0;
}

解释:
该题给出的红绿灯时间可以理解为动态时间,时间是随着路程和红绿灯本身时间会改变。可能出现多轮红绿灯时间,我们对此可以直接对整体红绿灯时间取余,留下的剩余时间就是到了该红绿灯口时,需要倒数的时间长短。
对红绿黄三种颜色的灯,都分为四种情况,第一种就是在本颜色灯范围内的时间,第二种是在本颜色范围外加上邻近颜色的时间,如果遇到了绿灯,那么不需要做任何改变,直接通行,第三种是在本颜色和邻近颜色外,在邻近颜色的邻近颜色内的时间,第四种是比第三种时间长,但是比总的红绿黄时间短。
对于剩余时间,需要和到达红绿灯路口的情况进行比较,如果满足条件,则对应的把剩余时间减去,得到的值加给总量sum。
建议:
大家画一个数轴理解为什么总量的加法是这样的式子,比较好理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值