【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;
}

 

posted @ 2023-03-15 17:30  吃人不吐葡萄  阅读(6)  评论(0)    收藏  举报