目录
一、问题描述
二、解答
(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 时,分别表示出发时刻,//此处的红绿灯状态是红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 tint 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 时,分别表示出发时刻,//此处的红绿灯状态是红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 tfor (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)题目中有循环往复的情况,可以考虑取余、用周期。