红绿灯先变绿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 秒时开始观察,那么在他观察的这个时刻,红绿灯的状态如下:
根据上述规律,我们可以计算出小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 秒内,红绿灯为绿灯的总时间。