CCF-CSP 201812-2 小明放学 满分题解
思路:
1.此题需要判断当小明到达红绿灯时,此时红绿灯的颜色情况,以及剩余的时间。
2.判断红绿灯的情况需要根据循环来判断,即采用总时间%(红+绿+黄),得到的余数用来判断。
3.绿灯情况可以直接走,不用计时,则在判断红绿灯颜色时,为简化代码,可不用写绿灯的情况,另外k=0的情况可以直接计时。
4.为避免内存不够,数据类型都采用long long类型。
细节注意:
1.刚开始知道的时间为出发时刻的时间
2.红绿灯的变化顺序为:红->绿->黄
3.黄灯等待完后需要等待红灯
代码如下:
#include <iostream>
using namespace std;
long long r,y,g,n;
int main()
{
cin>>r>>y>>g>>n;
long long sum=0;
long long sum1=0;
long long k,t;
while(n--)
{
cin>>k>>t;
sum1 = sum;
sum1 = sum1%(r+y+g);
if(k==0)//此时可以直接通行
{
sum+=t;
}
else if(k==1)//此时为红灯
{
if(sum1-t<0)//若此时还是红灯,则需要等待的时间为t-sum1
{
sum+=t-sum1;
}
else if(sum1-t>=g&&sum1-t<y+g)//若此时为黄灯,则需要等待的时间为y+g-(sum1-t)+r
{
sum+=y+g-(sum1-t)+r;
}
else if(sum1-t>=g+y&&sum1-t<y+g+r)//若此时为红灯,则需要等待的时间为r+y+g-(sum1-t)
{
sum+=r+y+g-(sum1-t);
}
}
else if(k==2)//此时为黄灯
{
if(sum1-t<0)//若此时还是黄灯,则需要等待的时间为t-sum1+r
{
sum+=t-sum1+r;
}
else if(sum1-t>=0&&sum1-t<r)//若此时为红灯,则需要等待的时间为r-(sum1-t)
{
sum+=r-(sum1-t);
}
else if(sum1 >= t+r+g && sum1-t< r+g+y)//若此时为黄灯,则需要等待的时间为r+g+y-(sum1-t)+r;
{
sum+=r+g+y-(sum1-t)+r;
}
}
else if(k==3)//此时为绿灯
{
if(sum1-t>=0&&sum1-t<y)//若此时为黄灯,则需要等待的时间为y-(sum1-t)+r
{
sum+=y-(sum1-t)+r;
}
else if(sum1-t>=y&&sum1-t<r+y)//若此时为红灯,则需要等待的时间为r+y-(sum1-t);
{
sum+=r+y-(sum1-t);
}
}
}
cout<<sum<<endl;
return 0;
}