201812-2小明放学
作者:互联网
题目感觉不是很难,一个坑就是要用long long类型,int型会溢出;再一个就是分类讨论的时候一定要仔细,我就是在第三种k==3里面把一个y写成r了,一遍一遍的抓头发,幸好最后改过来了。
#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;
}
欢迎交流指导。
标签:小明,int,scanf,long,201812,&&,time,放学,lld 来源: https://blog.csdn.net/L_xqqzldh/article/details/87910800