算法练习题11(红绿灯问题)

我:

#include <iostream>;
using namespace std;

int main() {
	/*
	第一行N和M 表示的N个十字路口  M 表示距离十字路口M千米处(此时所有路口的红绿灯刚从红灯跳到绿灯)
	第二行 N-1个正整数 为2个路口之间的距离
	第三行 N个正整数Ri,为红灯时间
	第四行 N个正整数Gi,为绿灯时间
	N<=10~5  M与Ai<=10  Ri与Gi<=5
	
	输出格式为 共N行,每行表示为这辆车通过每个十实际上路口的最早时间
	车速度为1千米每分钟
	*/
	int n=0, m = 0;
	int Ai[10005] = { 0 };
	int Ri[5] = { 0 };
	int Gi[5] = { 0 };

	cin >> n>> m;
	for (int i = 0; i < n-1; i++)
	{
		cin>>Ai[i];
	}
	for (int i = 0; i < n; i++)
	{
		cin>>Ri[i];
	}
	for (int i = 0; i < n; i++)
	{
		cin >> Gi[i];
	}

	int totalSec = 0;
	int crossingTime[10005] = { 10 };
	for (int i = 0; i <=n; i++)
	{
		
		if (i == 0) {
			totalSec = m;
		}
		else {
			totalSec += Ai[i-1];
		}
		
		int totalTime = Ri[i] + Gi[i];
		int point = totalSec % totalTime;
		if (point > Gi[i]) {//说明在等红灯 要加上剩余=红灯时间 否则 直接绿灯。
			totalSec += (Ri[i] - (point-Gi[i]));
		}
		crossingTime[i] = totalSec;
	}

	for (int i = 0; i < n; i++)
	{
		cout << crossingTime[i] << endl;
	}
	return 0;
}

大佬:

int N, M;  // N 个十字路口,从距离第一个十字路口的 M 千米处除法
	
	cin >> N >> M;
	Ai[0] = M;   // 表示汽车起点至第一个路口之间的距离

	for(int i = 1; i < N; i++) {
		cin >> Ai[i];
	}
	for(int i = 1; i <= N; i++) {
		cin >> Ri[i];
	}
	for(int i = 1; i <= N; i++) {
		cin >> Gi[i];
	}
	
	int ans = 0;  // 到达每个十字路口时所花费的时间
	int tp;
	int ti = Ai[0];   // 从当前路口除法,至下一个路口时花了多上时间
					  // 此时的 ti 表示从但当前起点,至第一个十字路口,花了 ti 时间
	
	for(int i = 1; i <= N; i++) {
		ans = ans + ti;
		
		// 判断,当前路口是红灯还是绿灯
		// 如果是绿灯,则直接通过,且花费时间是 ans 秒
		// 如果是红灯,则等待,同时 ans = ans + 等待红灯时间
		tp = Gi[i] + Ri[i];    // 当前路口的一个 红绿灯周期时间
		ti = ans % tp;
		if(Gi[i] < ti) {
			ans = ans + (tp - ti);
		}
		
		ti = Ai[i];    // 统计当前路口到下一个路口时花费的时间
		cout << ans << endl;
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值