//与上一题不同的是,k=1、2、3 时,分别表示出发时刻,所以要考虑到走完这段路程的时候灯的颜色是否已经变了
//红绿黄循环。用sum记录前面路程用的总时间,circle记录红黄绿一轮的时间。是红灯时,判断t和sum的大小,如果t>sum说明红灯还没完,t-sum是剩余要等待的红灯时间;若t<sum说明红灯已经结束,sum-t是超出的时间,考虑到可能过去了不止一轮先求余,int temp=(sum-t)%circle,再判断temp是否超出了绿灯时间g,如果超出则又到黄灯,再判断是否超出黄灯超出则又到红灯。对于黄灯和绿灯的判断也类似。
满分代码:
#include <iostream>
using namespace std;
int main()
{
int r,y,g,n,k,t;
long long sum=0;
cin >> r >> y >> g >> n;
int circle=r+y+g;
for(int i=0;i<n;i++)
{
cin >> k >> t;
if(k==0) sum+=t;
else if(k==1)
{
if(t>=sum) sum=t;//其实只有在第一次遇到灯时有可能出现这种情况
else
{
int temp=(sum-t)%circle;
if(temp>=g&&temp<=g+y) sum+=y+g-temp+r;
else if(temp>g+y) sum+=circle-temp;
}
}
else if(k==2)
{
if(t>=sum) sum=t+r;
else
{
int temp=(sum-t)%circle;
if(temp<r) sum+=r-temp;
else if(temp>=g+r&&temp<=g+y+r) sum+=circle-temp+r;
}
}
else if(k==3)
{
if(t<sum)
{
int temp=(sum-t)%circle;
if(temp<=y) sum+=y-temp+r;
else if(temp>y&&temp<y+r) sum+=r+y-temp;
}
}
}
cout << sum << endl;
return 0;
}
注意:long long sum=0;一定要初始化,否则会导致80分。
一定要long long,否则60分。
其实t>sum的几率很小很小。
该题的精髓在于怎么处理循环取余
int temp=(sum-t)%circle;