C语言红绿灯时间问题

img

红绿灯先变绿a秒,再变红b秒,然后再变绿a秒,变红b秒,不断循环,小Q在红绿灯刚刚变绿的时候开始观察,持续了c秒
请求出在这c秒中有多少时间红绿灯是绿的


#include <stdio.h>

int main() {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c); // 读取 a、b、c 参数
    int cycle = a + b; // 红绿灯一个循环的总时间
    int green = 0; // 红绿灯绿色显示的总时间
    int t = c; // 计时器
    while (t > 0) {
        if (t >= a) { // 如果剩余的时间大于绿灯时间 a,那么绿灯全部亮起
            green += a;
            t -= a;
        } else { // 否则只有剩余的时间全部是绿灯时间
            green += t;
            t = 0;
        }
        if (t >= b) { // 如果剩余的时间大于红灯时间 b,那么红灯全部亮起
            t -= b;
        } else { // 否则只有剩余的时间全部是红灯时间
            t = 0;
        }
    }
    printf("%d\n", green); // 输出绿灯的总时间
    return 0;
}

上面这段代码中,我们首先通过 scanf 函数读取三个参数 a、b 和 c,然后计算出一个完整的红绿灯循环的时间 cycle。
 
接着,我们对于每个循环,分别判断剩余时间是否大于绿灯时间 a,如果大于则绿灯全部亮起,绿灯时间加上 a,计时器减去 a;否则只有剩余时间全部是绿灯时间。
 
然后我们再判断剩余的时间是否大于红灯时间 b,如果大于则红灯全部亮起,红灯时间为 b,计时器再减去 b。因为 c 不一定是一个完整的循环时间,因此我们需要循环判断,直到剩余时间不够执行下一个循环。最终,我们输出绿灯的总时间即可。


#include<iostream>
using namespace std;
int main(){
 int a,b,c,x;
cin>>a>>b>>c;
if(c%(a+b)<=a)
x=a*(c/(a+b))+c%(a+b);
else
x=a*(c/(a+b))+a;
cout<<x;
return 0;
}

#include<iostream>
using namespace std;
int main() 
{
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    int cnt = c / (a+b);
    int times = cnt * a;
    if (c % (a+b) > 0)
    {
        times += (c % (a+b)) > a ? a : (c % (a+b));
    }
    printf("%d", times);
    return 0;
}

#include <iostream>

using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;

    int cycle_time = a + b;
    int green_time = 0;

    // 计算绿灯亮的总时间
    if (c >= a) {
        int num_cycles = (c - a) / cycle_time + 1;
        green_time = num_cycles * a;
        if (c >= a + num_cycles * cycle_time - b) {
            green_time += c - (a + num_cycles * cycle_time - b);
        }
    } else {
        green_time = c;
    }

    cout << green_time << endl;

    return 0;
}
首先读入输入的 a、b、c 值,然后计算出红绿灯变化的周期时间 cycle_time,以及绿灯亮的总时间 green_time。

如果观察时间 c 大于等于第一个绿灯亮的时间 a,那么红绿灯会在这个时间段内多次变化。我们计算出这个时间段内完整的周期数 num_cycles,然后用这个数乘以每个周期中绿灯亮的时间 a 得到绿灯亮的总时间。此外,如果观察时间 c 超过了最后一个绿灯变成红灯的时间,那么我们还需要加上这段时间内绿灯亮的时间。最后,如果观察时间 c 小于第一个绿灯亮的时间 a,那么绿灯亮的总时间就是 c。

最后输出绿灯亮的总时间即可。


首先我们需要知道,一个红绿灯变换的周期为 a+b 秒,其中 a 为绿灯持续时间,b 为红灯持续时间。另外,假设小Q在一个周期内的第 x 秒时开始观察,那么在他观察的这个时刻,红绿灯的状态如下:

  • 如果 x < a,则红绿灯为绿灯,因为此时绿灯还没有变成红灯;
  • 如果 a ≤ x < a+b,则红绿灯为红灯,因为此时绿灯已经变成了红灯;
  • 如果 x ≥ a+b,则红绿灯为绿灯,因为此时红灯已经持续了 b 秒,又回到了绿灯状态。

根据上述规律,我们可以计算出小Q在观察过程中所处每个周期内红绿灯为绿灯的总时间 t1,以及在最后一个不完整周期内红绿灯为绿灯的时间 t2。则小Q所处的 c 秒内,红绿灯为绿灯的总时间为:

t = t1 + t2

其中 t1 等于一个周期的长度 a+b 减去 b 秒(去掉红灯持续时间)再乘以观察的周期数,即:

t1 = floor(c / (a+b)) * (a+b) - b

其中 floor() 函数表示向下取整。而 t2 则等于最后一个不完整周期内红绿灯为绿灯的时间,即:

t2 = min(c - floor(c / (a+b)) * (a+b), a)

因此,小Q所处 c 秒内,红绿灯为绿灯的总时间为:

t = t1 + t2 = floor(c / (a+b)) * (a+b) - b + min(c - floor(c / (a+b)) * (a+b), a)

这就是小Q所处 c 秒内,红绿灯为绿灯的总时间。