P2077 红绿灯(解法2)
题目描述
在一个城市,有一条笔直的公路,在这条公路上有 NN 个十字路口,每个路口都设有一个红绿灯,已知相邻的两个路口距离为 A_iA**i 千米 (1\le i < N)(1≤i<N),每个路口的红灯时间为 R_iR**i,绿灯时间为 G_iG**i,没有黄灯,现在有一辆车从距离 11 号十字路口 MM 千米的位置出发,且此时所有路口的红绿灯刚好从红灯跳到绿灯,问这辆车通过每个路口的时间(不能闯红灯,这辆车的速度为 11 千米每分钟)。
输入格式
第一行两个正整数 NN 和 MM
第二行 N-1N−1 个正整数 A_iA**i
第三行 NN 个正整数 R_iR**i,为红灯时间(分钟)
第四行 NN 个正整数 G_iG**i,为绿灯时间(分钟)
输出格式
共 NN 行,每行一个正整数,为这辆车通过每个十字路口的最早时间。
输入输出样例
输入 #1复制
5 3
2 4 3 2
3 4 3 4 3
2 3 2 3 1
输出 #1复制
5
7
11
14
16
说明/提示
对于 50%50% 的数据 N\le 1000N≤1000;
对于 100%100% 的数据 N\le 10^5N≤105,M,A_i\le 10M,A**i≤10,R_i,G_i\le 5R**i,G**i≤5。
#include<bits/stdc++.h>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int main(){
int total_time=0,waiting_time;
int n,m;
cin>>n>>m;
int a[n-1],r[n],g[n];
//输入N—1个相邻路口距离
a[0] = m;
for(int i=1;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
cin>>r[i];
}
for(int i=0;i<n;i++){
cin>>g[i];
}
for(int i=0;i<n;i++){
total_time+=a[i]/1; //直接加上间隔距离所花时间
//判断是否红灯
if(total_time%(r[i]+g[i])>g[i]){
//是红灯
waiting_time=r[i]+g[i]-(total_time%(r[i]+g[i])); //计算等待红灯的时间
total_time += waiting_time;//加上等红灯的时间
}
cout<<total_time<<endl;
}
return 0;
}