【CCF】201812-2小明放学
这里用< 还是<=都会成功
因为once==t是应该是红灯还是绿灯 是两灯交界处的微妙瞬间 不影响
<
#注意 左闭右开!!! r,y,g=map(int,input().split())#红30黄3绿30 n=int(input())#总共经过的道路段数和看到的红绿灯数目 ss=0#总时间 deng=r+y+g#一次红绿灯的时间 w=0#等待 for i in range(n): k,t=map(int,input().split()) if k==0: ss+=t else: once=ss%deng#一个红绿灯周期内 过去了多久 temp=once-t if k==1:#红还剩t秒 if temp<0:#还是红灯 once==t是应该是红灯还是绿灯 是两灯交界处 不会等待 w=-temp elif temp<g:#红 绿 w=0 elif temp<y+g:#红 绿 黄 w= -temp+deng#-temp+g+y+r else :#红 绿 黄 红 w= -temp+deng#等第一个红灯+一轮等 ss+=w elif k==2:#黄还剩t秒 if temp<0:#还是黄 '用once秒等了黄灯 还有t-once秒需要等黄灯' w=-temp+r#等待时间=黄灯+红灯r elif temp<r:#黄 红 w=-temp+r elif temp<r+g:#黄 红 绿 w=0 else:#黄 红 绿 黄 红 w=-temp+deng+r ss+=w elif k==3:#绿 if temp<=0:#还是lv w=0 elif temp<=y:#绿 黄 w=-temp+y+r elif temp<=y+r:#绿 黄 红 w=-temp+y+r else:# w=0 ss+=w #ss+=w #print('w',w) print(ss)
<=
#注意 左闭右开!!! r,y,g=map(int,input().split())#红30黄3绿30 n=int(input())#总共经过的道路段数和看到的红绿灯数目 ss=0#总时间 deng=r+y+g#一次红绿灯的时间 w=0#等待 for i in range(n): k,t=map(int,input().split()) if k==0: ss+=t else: once=ss%deng#一个红绿灯周期内 过去了多久 temp=once-t if k==1:#红还剩t秒 if temp<0:#还是红灯 w=-temp elif temp<g:#红 绿 w=0 elif temp<y+g:#红 绿 黄 w= -temp+deng#-temp+g+y+r else :#红 绿 黄 红 w= -temp+deng#等第一个红灯+一轮等 ''' 红灯还剩t,此时一个周期过去了once,也就是说 这个周期里用t秒等了红灯,剩下once-t秒时间 又过去g,此时剩下once-t-g的时间 也就是从黄灯开始过去了once-t-g,此时应该等待y-(once-t-g) 再等待一个红灯 总等待是y-(once-t-g)+r=t-once+y+g+r=t-once+deng=-temp+deng ''' elif k==2:#黄还剩t秒 if temp<0:#还是黄 '用once秒等了黄灯 还有t-once秒需要等黄灯' w=-temp+r#等待时间=黄灯+红灯r elif temp<r:#黄 红 w=-temp+r elif temp<r+g:#黄 红 绿 w=0 else:#黄 红 绿 黄 !!!红 w=-temp+deng+r elif k==3:#绿 if temp<0:#还是lv w=0 elif temp<y:#绿 黄 w=-temp+y+r elif temp<y+r:#绿 黄 红 w=-temp+y+r else:# w=0 ss+=w print(ss)
python
r,y,g=input().split() r,y,g=int(r),int(y),int(g) n=int(input()) time=0#目前所用时间 T=r+y+g#灯红绿黄循环一个周期的时间 #红、绿、黄是路灯循环的过程 for i in range(n): k,t=input().split() k,t=int(k),int(t) yu=time%T#初始情况t过yu秒后才是到达路口的情况 if k==0:#经过道路 time+=t elif k==1:#初始是红灯 if yu<=t:#红 还没到绿灯 time+=t-yu elif yu<=t+g:#绿 还没到黄灯 time+=0 elif yu<=t+g+y:#黄 还没到红灯 time+=(t+g+y)-yu+r else:#红 红-绿-黄-红 time+=t+T-yu#T-yu是牌子距离显示t还需要的时间 #t+T-yu是显示时间 elif k==2: if yu<=t:#黄 time+=t-yu+r elif yu<=t+r:#红 time+=t+r-yu elif yu<=t+r+g:#绿 time+=0 else:#黄 time+=t+T-yu+r elif k==3: if yu<=t:#绿 time+=0 elif yu<=t+y:#黄 time+=t+y-yu+r elif yu<=t+y+r:#红 time+=(t+y+r)-yu else:#绿 time+=0 print(time)
C++
#include<stdio.h> int main(){ long long T=0,wait; //T为总时间,wait为在路口等待的时间 long long r,y,g,n,b; scanf("%lld%lld%lld\n",&r,&y,&g); long long sum=r+g+y; scanf("%lld",&n); for(int i=0;i<n;i++){ int k,time; scanf("%d%d",&k,&time); if(k==0){ //若为一段路,直接加上通过这段路所用时间 T+=time; } else { b=T%sum; //到这个红绿之前所用时间T取余sum 确保b是在一个红绿灯周期内 if(k==1){ //出发时是红灯 if(b-time<0) wait=time-b; //到达时未变色还是红灯 else if(b-time<g) wait=0; //到达时变为绿灯 //下面两句可以合成一句 else wait=63-b; else if(b-time-g>0&&b-time-g<y) wait=sum-b+time; //到达时变为黄灯 wait=(y-(b-time-g)需等待黄灯秒数)+r秒红灯 else wait=sum-b+time; //到达时由红变绿变黄又变红 wait=r秒红灯-(b-time-g秒绿灯-y秒黄灯) } else if(k==2){ //出发时是黄灯 if(b-time<0) wait=time-b+r; //到达时黄灯未变色 else if(b-time<r) wait=r-(b-time); //到达时变为红灯 else if(b-time-r>=0&&b-time-r<=g) wait=0; // 到达时变为绿灯 else wait=y-(b-time-r-g)+r; //到达时又变为黄灯 } else{ //出发时是绿灯 if(b-time<0) wait=0; //到达时绿灯未变色 else if(b-time>=0&&b-time<y) wait=r+y-(b-time); //到达时变为黄灯 else if(b-time-y>=0&&b-time-y<r) wait=r-(b-time-y); //到达时变为红灯 else wait=0; //到达时变为绿灯 } T+=wait; //加上在每个路口等待的时间 } } printf("%lld",T); return 0; }

浙公网安备 33010602011771号