目录
一、问题描述
二、解答
(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)题目中有循环往复的情况,可以考虑取余、用周期。