CSP-CCF★★★201812-2小明放学★★★

目录

一、问题描述

二、解答

(1)注意:

(2)80分版:

(3)100分版:

三、总结


一、问题描述

二、解答

(1)注意:

题目的n小于等于10的5次方,而时间t不超过10的6次方,那么回家的时间最大大概为n*t,即10的11次方,显然超过了int的范围(10的9次方)。所以在这里涉及到计算总时间的都要使用long long型。

(2)80分版:

思路:大情况:k==0和k!=0;

在k!=0中又分三种小情况:t>time;t==time;t<time;

在t<time中,通过累加直到count大于或等于time,利用flag作为下一个应该累加的数的标志,利用color来记录最后一个加上的灯的颜色。

分析:可能是写的太复杂了,显示运行超时

代码:

#include<iostream>
using namespace std;
int main()
{
	int r, y, g;
	cin >> r >> y >> g;
	int n;
	cin >> n;
	//红绿黄
	int k, t;
	long long time = 0;
	//k=1、2、3 时,分别表示出发时刻,
	//此处的红绿灯状态是红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 t
	int flag = 0;
	long long count = 0;
	for (int i = 1; i <= n; i++)
	{
		cin >> k >> t;
		count = t;
		if (k == 0) { time += t; }
		else if (k != 0)
		{
			//int flag = k+1;//下一盏灯亮的标志
			int color = k;
			if (count > time) {
				if(color==2)//黄色
				{
					time += (count - time + r);
				}
				if(color==1)//红色
				{
					time += (count - time);
				}//绿色不需要等待

			}
			else if (count == time)
			{
				if (color == 3)//绿色
				{
					time += (r + y);
				}
				if(color==2)//黄色
				{
					time += r;
				}
			}
			else if(count<time){
				if (color == 1)//红灯
				{
					flag = 3;//表示下一个亮的是绿灯,累加的下一个标志
				}
				else if (color == 2) { flag = 1; }
				else if (color == 3) { flag = 2; }
			while (count <time)//开始累加,按照红、绿、黄的顺序
			{
				if (flag == 1)//红灯
				{
					
					flag = 3;
					color = 1;
					count += r;
				}
				else if (flag == 2)//黄灯
				{
					
					flag = 1;
					color = 2;
					count += y;
				}
				else if (flag == 3)//绿灯
				{
					
					flag = 2;
					color = 3;
					count += g;
				}
			}
			if(count==time){
			if (color == 2)//黄
			{
				time += r;
			}
			else if (color == 3)//绿
			{
				time += (r + y);
			}
			}
			else if (count > time)
			{
				if(color==1)//红
				{
					time += (count - time);
				}
				else if (color == 2)//黄
				{
					time += (count - time) + r;
				}
			}
			}
		}

	}
	cout << time;
	return 0;
}

(3)100分版:

重点:如图

代码:

#include<iostream>
using namespace std;
int main()
{
	int r, y, g;
	cin >> r >> y >> g;
	int n;
	cin >> n;
	int k, t;
	long long time = 0;//注意这里的时间要用long long类型
	long long count = 0;
    //亮灯顺序:红绿黄
	//k=1、2、3 时,分别表示出发时刻,
	//此处的红绿灯状态是红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 t
	for (int i = 1; i <= n; i++)
	{
		cin >> k >> t;
		if (k == 0) { time += t; }
		else {
			if (k == 1) {
				if (time < t) { time += (t - time); }
				else if (time == t) { time += 0; }
				else if(time>t){//绿黄红
					count = (time - t) % (r + y + g);
					if (count >= 0 && count < g)
					{
					}
					else if (count >= g && count < (g + y))
					{
						time += (g + y - count + r);
					}
					else if (count >= (g + y) && count < (g + y + r))
					{
						time += (g + y + r - count);
					}
				}
			}
			if (k == 2) {//红绿黄
				if (time < t) { time += (t - time+r); }
				else if (time == t) { time += r; }
				else if (time > t){
					count = (time - t) % (r + y + g);
				if (count >= 0 && count < r)
				{
					time += (r - count);
				}
				else if (count >= r && count < (r + g))
				{
				}
				else if (count >= (r + g) && count < (r + g + y))
				{
					time += (r + g + y - count + r);
				}}
				
			}
			if (k == 3) {//黄红绿
				if (time < t) { time += 0; }
				else if (time == t) { time += r+y; }
				else if (time > t) {
					count = (time - t) % (r + y + g);
					if (count >= 0 && count < y)
					{
						time += (y - count + r);
					}
					else if (count >= y && count < (r + y))
					{
						time += (r + y - count);
					}
					else if (count >= (r + y) && count < (r + g + y))
					{
					}
				}
			}
		}
	}
	cout << time;
	return 0;
}

三、总结

(1)如果数的规模很大时,估算一下,看有没有超过10的9次方,超过的话就要用long long。

(2)题目中有循环往复的情况,可以考虑取余、用周期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值