题目描述
思路
是第一题小明上学的升级版
注意这里的数据类型都要使用long long!
对于每一个输入(k,t)是相对于出发时的时刻而言的,因此我们需要根据现在已经过去的时间,推算出现在还需要等待多长时间。这里我用getTime这个函数来计算。
我们利用一个[0,r+g+y]的数轴来辅助计算
第一步:计算出发时刻,在数轴上的位置
第二步:计算times时间之后,在数轴上的位置
第三步:计算改时间下,需要等待的时间
如第四条记录。k为2,t为2,表示此时处于黄灯,且还有2秒黄灯结束。
1、0时刻在数轴上的位置为,(30+3+30-2),也就是61
2、当到达该红绿灯时,时间已经过去了21秒。那么现在在数轴上的位置就是(61+21)%(30+3+30),也就是19
3、计算19秒处到绿灯的距离,也就是30-19=11。
代码
#include <bits/stdc++.h>
using namespace std;
long long r,y,g,n,ans,k,t;
long long getTime(int k,int t,long long times){
long long cur;//当前的时间
if(k == 1){//红灯
cur = r - t;
}else if(k == 3){//绿灯
cur = r+g - t;
}else if(k == 2){//黄灯
cur = r+g+y -t;
}
cur = (cur+times)%(r+y+g);
if(cur <= r){//在红灯位置
cur = r-cur;//返回需要的等待时间
}else if(cur <= r+g){//在路灯位置,无需等待
cur= 0;
}else if(cur <= r+g+y){
cur = r+g+y-cur+r;//黄灯结束的时间+红灯时间
}
return cur;
}
int main() {
cin>>r>>y>>g>>n;
for(int i=0;i<n;i++){
cin>>k>>t;
if(k == 0){
ans += t;//路段
}else{
ans += getTime(k,t,ans);
}
}
cout<<ans;
return 0;
}