我:
#include ;
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;