欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > CSP-CCF★★★201812-2小明放学★★★

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

2025/10/27 10:55:33 来源:https://blog.csdn.net/2301_79705447/article/details/142108026  浏览:    关键词: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 时,分别表示出发时刻,//此处的红绿灯状态是红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 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)题目中有循环往复的情况,可以考虑取余、用周期。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词