201812-2 小明放学
重点:计算当前时刻信号灯经过的总时间并对r+g+y的取模,得到当前信号灯的状态
#include<cstdio>
int main()
{
int r,y,g,n,k,t;
int ans=0;
scanf("%d%d%d",&r,&y,&g);
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&k,&t);
if(k==0) ans+=t;//如果是道路直接加进结果
//如果是信号灯,转化为小明上学的问题
else{
//将出发时刻红绿灯的剩余时间转换为当前时刻红绿灯的剩余时间
//出发时刻红绿灯的剩余时间转换为已经亮灯的时间(以红灯时间段的起点为参照原点)
if(k==1)t=r-t;
else if(k==2)t=r+g+y-t;
else t=r+g-t;
t=(t+ans)%(r+g+y);//对r+g+y的取模,得到当前信号灯的状态
if(t>=0 && t<r)ans=ans+(r-t);
if(t>=r && t<r+g)continue;//绿灯直接通过
if(t>=r+g && t<=r+g+y)ans=ans+(r+g+y-t)+r;
}
//printf("No.%d %d\n",n+1,ans);
}
printf("%d\n",ans);
return 0;
}
上面代码不通过,需要用long long 型变量方可通过,如下:
#include<cstdio>
typedef long long ll;
int main()
{
ll r,y,g,n,k,t;
ll ans=0;
scanf("%lld%lld%lld",&r,&y,&g);
scanf("%lld",&n);
while(n--)
{
scanf("%lld%lld",&k,&t);
if(k==0) ans+=t;
else{
if(k==1)t=r-t;
else if(k==2)t=r+g+y-t;
else t=r+g-t;
t=(t+ans)%(r+g+y);
if(t>=0 && t<r)ans=ans+(r-t);
if(t>=r && t<r+g)continue;
if(t>=r+g && t<=r+g+y)ans=ans+(r+g+y-t)+r;
}
//printf("No.%d %d\n",n+1,ans);
}
printf("%lld\n",ans);
return 0;
}