错误代码:
#include<stdio.h>
int main()
{
int r,y,g,n,k,sum=0,t;
scanf("%d %d %d",&r,&y,&g);//红灯 r 秒,黄灯 y 秒,绿灯 g 秒
scanf("%d",&n);
while(n–)
{
scanf("%d %d",&k,&t);
//无灯情况下
if(k0)
{
sum+=t;
}
//红灯
if(k1)
{
t=(r-t)+sum;
t%=(r+g+y);
if(t<r) //若持续时间小于红灯总时间
sum+=(r-t);
else if(t>=g+r) //若持续时间大于红+绿总时间且小于黄灯总时间,即在黄灯状态下
sum+=(r+r+g+y-t);
}
//黄灯
if(k2)
{
t=(r+g+y-t)+sum;
t%=(r+g+y);
if(t<r)
sum+=(r-t);
else if(t>=g+r)
sum+=r+(r+g+y-t);
}
//绿灯
if(k3)
{
t=(r+g-t)+sum;
t%=(r+g+y);
if(t<r)
sum+=(r-t);
else if(t>=g+r)
sum+=r+(r+g+y-t);
}
}
printf("%d",sum);
return 0;
}
错误原因://与 小明上学 一题的不同之处在于所有灯的显示颜色及时间都是出发时刻的
//本题的一个陷阱,结果可能会超出整型的范围,要定义成长整型 (出错地方)
//注意信号灯的转换规律为红——绿——黄
正确代码:
#include<stdio.h>
int main()
{
long long sum=0,t;
int r,y,g,n,k;
scanf("%d %d %d",&r,&y,&g);//红灯 r 秒,黄灯 y 秒,绿灯 g 秒
scanf("%d",&n);
while(n–)
{
scanf("%d %d",&k,&t);
//无灯情况下
if(k0)
{
sum+=t;
}
//红灯
if(k1)
{
t=(r-t)+sum;
t%=(r+g+y);
if(t<r) //若持续时间小于红灯总时间
sum+=(r-t);
else if(t>=g+r) //若持续时间大于红+绿总时间且小于黄灯总时间,即在黄灯状态下
sum+=(r+r+g+y-t);
}
//黄灯
if(k2)
{
t=(r+g+y-t)+sum;
t%=(r+g+y);
if(t<r)
sum+=(r-t);
else if(t>=g+r)
sum+=r+(r+g+y-t);
}
//绿灯
if(k3)
{
t=(r+g-t)+sum;
t%=(r+g+y);
if(t<r)
sum+=(r-t);
else if(t>=g+r)
sum+=r+(r+g+y-t);
}
}
printf("%lld",sum);
return 0;
}