CCF 201812-2 小明放学 (C++)

201812-2 小明放学

试题编号: 201812-2
试题名称: 小明放学
时间限制: 1.0s
内存限制: 512.0MB
问题描述:CCF 201812-2 小明放学 (C++)_第1张图片
解题过程

需要注意的点是输入的是出发时刻的红绿灯情况,当我们到达相应的红绿灯时,可能亮灯情况已经发生改变,要考虑所有情况。

AC代码
#include
using namespace std;
int main()
{
     
	int r,y,g;
	cin>>r>>y>>g;
	int n;
	cin>>n;
	long long int sum=0;//可能会超界 
	int k,t;
	while(n--)
	{
     
		cin>>k>>t;
		/*可能到达红绿灯时已经过多轮循环,不需要计算循环时间 */ 
		int temp=sum%(r+y+g);
		/*以下分支相同处理,分别将其处于每个时间段情况列出即可 */
		switch(k)
		{
     
			case 0://直接通过 
				sum+=t;break;
			case 1://出发时为红灯 
				if(temp<t)//到达仍为红灯 
					sum+=t-temp;
				else if(temp>=t&&temp<t+g);//到达时已经变为绿灯				
				else if(temp>=t+g&&temp<t+g+y)//到达时已经变为黄灯 
					sum+=t+g+y-temp+r;
				else if(temp>=t+g+y)//到达时可能又变为红灯 
					sum+=t+g+y+r-temp;
				break;
			case 2://出发时为黄灯 
				if(temp<t)//到达仍为黄灯 
					sum+=t-temp+r;
				else if(temp>=t&&temp<t+r)//到达时已经变为红灯	
					sum+=t+r-temp;
				else if(temp>=t+r&&temp<t+r+g);//到达时已经变为绿灯	 
				else if(temp>=t+r+g)//到达时可能又变为黄灯
					sum+=t+r+g+y-temp+r;
				break;
			case 3://出发时为绿灯 
				if(temp<t);//到达时已经变为绿灯
				else if(temp>=t&&temp<t+y)//到达时已经变为黄灯
					sum+=t+y-temp+r;
				else if(temp>=t+y&&temp<t+y+r)//到达时已经变为红灯
					sum+=t+y+r-temp;
				else if(temp>=t+y+r);//到达时可能又变为绿灯				
				break;
		}
	}
	cout<<sum;
	return 0;
} 

你可能感兴趣的:(c++,数据结构,算法,c语言,csp)