需要注意的是该题需要用到上一题的条件,即灯光的变化是按照:红绿黄循环变化的
第一想法是模拟该过程即可,即根据条件得到到达某一个红绿灯时经过的时间,然后再根据该时间去循环该红绿灯的变化,得到当前时间的灯光状态,再进行计算叠加即可
#include<iostream> using namespace std; int r,y,g,n; long long ans; void fun(int t,int sub,int cur){ t-=sub; do{ if(cur==1){//红 cur=3;//红变绿 }else if(cur==2){//黄 cur=1;//黄变红 }else if(cur==3){//绿 cur=2;//绿变黄 } if(cur==1){ t+=r; }else if(cur==2){ t+=(y); }else if(cur==3){ t+=g; } }while(t<0); if(cur==1){ ans+=t; }else if(cur==2){ ans+=(r+t); } } int main(){ cin>>r>>y>>g; cin>>n; for(int i=0;i<n;i++){ int k,t; cin>>k>>t; if(k==0){ ans+=t; }else{ if(t-ans>0){//不会影响当前红绿灯状态 if(k==1){ ans+=t; }else if(k==2){ ans+=(r+t); } }else{ fun(t,ans,k); } } } cout<<ans<<endl; return 0; }
该代码只能通过60分,目前还未查询出问题所在
思路2(区间模拟借鉴自)
我们使用一个坐标轴来模拟时间的变化,由出发时刻得到的每一个t,我们都可以推算出在坐标轴上的位置,然后再进行时间的变化(即得到当前时刻的时间坐标),再判断还需要多少时间才会变成绿灯即可
k = 0,t表示行驶路程的时间,直接累加
k = 1;t表示人在起点时,该红灯剩余的时间
k = 2;t表示人在起点时,该黄灯剩余的时间
k = 3;t表示人在起点时,该绿灯剩余的时间
可以画一个坐标图模拟过时间cnt后灯的颜色,从而计算还需等待多久
#include<iostream> using namespace std; int r,y,g,n; long long ans; void fun(int t,int sub,int cur){ t-=sub; do{ if(cur==1){//红 cur=3;//红变绿 }else if(cur==2){//黄 cur=1;//黄变红 }else if(cur==3){//绿 cur=2;//绿变黄 } if(cur==1){ t+=r; }else if(cur==2){ t+=(y); }else if(cur==3){ t+=g; } }while(t<0); if(cur==1){ ans+=t; }else if(cur==2){ ans+=(r+t); } } int main(){ cin>>r>>y>>g; cin>>n; for(int i=0;i<n;i++){ int k,t; cin>>k>>t; if(k==0){ ans+=t; }else{ if(t-ans>0){//不会影响当前红绿灯状态 if(k==1){ ans+=t; }else if(k==2){ ans+=(r+t); } }else{ fun(t,ans,k); } } } cout<<ans<<endl; return 0; }