SiriBlog

siriyang的个人博客


  • 首页

  • 排行榜

  • 标签115

  • 分类37

  • 归档319

  • 关于

  • 搜索

CCF-CSP:201812-2小明放学

发表于 2020-01-03 更新于 2021-10-29 分类于 计算机 , 算法题 , CCF-CSP 阅读次数: Valine:
本文字数: 2.5k 阅读时长 ≈ 2 分钟

CCF-CSP题目汇总

题目

试题编号: 201812-2
试题名称: 小明放学
时间限制: 1.0s
内存限制: 512.0MB

题目背景

  汉东省政法大学附属中学所在的光明区最近实施了名为“智慧光明”的智慧城市项目。具体到交通领域,通过“智慧光明”终端,可以看到光明区所有红绿灯此时此刻的状态。小明的学校也安装了“智慧光明”终端,小明想利用这个终端给出的信息,估算自己放学回到家的时间。

问题描述

  一次放学的时候,小明已经规划好了自己回家的路线,并且能够预测经过各个路段的时间。同时,小明通过学校里安装的“智慧光明”终端,看到了出发时刻路上经过的所有红绿灯的指示状态。请帮忙计算小明此次回家所需要的时间。

输入格式

  输入的第一行包含空格分隔的三个正整数 r、y、g,表示红绿灯的设置。这三个数均不超过 106。
  输入的第二行包含一个正整数 n,表示小明总共经过的道路段数和路过的红绿灯数目。
  接下来的 n 行,每行包含空格分隔的两个整数 k、t。k=0 表示经过了一段道路,将会耗时 t 秒,此处 t 不超过 106;k=1、2、3 时,分别表示出发时刻,此处的红绿灯状态是红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 t,此处 t 分别不会超过 r、y、g。

输出格式

  输出一个数字,表示此次小明放学回家所用的时间。

样例数据

样例输入

1
2
3
4
5
6
7
8
9
10
30 3 30
8
0 10
1 5
0 11
2 2
0 6
0 3
3 10
0 3

样例输出
46

样例说明
  小明先经过第一段路,用时 10 秒。第一盏红绿灯出发时是红灯,还剩 5 秒;小明到达路口时,这个红绿灯已经变为绿灯,不用等待直接通过。接下来经过第二段路,用时 11 秒。第二盏红绿灯出发时是黄灯,还剩两秒;小明到达路口时,这个红绿灯已经变为红灯,还剩 11 秒。接下来经过第三、第四段路,用时 9 秒。第三盏红绿灯出发时是绿灯,还剩 10 秒;小明到达路口时,这个红绿灯已经变为红灯,还剩两秒。接下来经过最后一段路,用时 3 秒。共计 10+11+11+9+2+3=46 秒。

评测用例规模与约定

  有些测试点具有特殊的性质:

  • 前 2 个测试点中不存在任何信号灯。

  测试点的输入数据规模:

  • 前 6 个测试点保证 n $\le 10^3$ 。
  • 所有测试点保证 n $\le 10^5$。

解答

分析

  使用一个time变量记录总的路程时间。由于之后的红绿灯状态会随着时间变化而变化,我们每读入一组数据就处理一组,这样对每组数据来说time就表示从出发时刻起到达该点的所用的时间,根据time就可以模拟更新出此刻红路灯的状态。模拟之后再分别判断一下:如果是道路,就直接加上t;如果为红灯,直接加上t;如果为黄灯,加上黄灯剩余时间t后再加上红灯持续时间r;绿灯直接通过。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <iostream>

using namespace std;

int main() {

int r, y, g;//分别存储红黄绿灯的持续时间
int n;//数据数目
long long time;//由于后期数据会很大,一开始使用int和long都跑不过最后四组数据
int period;//红绿灯一轮变换的时长,后期数据大了以后直接模拟会超时,所以使用模运算加速

time = 0;

cin >> r >> y >> g >> n;

period = r + y + g;

for (int i = 0; i < n; i++) {
int k, t;

cin >> k >> t;

long long tn = time % period;//加速运算
while (tn > 0) {//模拟灯光变换
if (k == 0) {
break;
}

if (k == 1) {
if (tn >= t) {
tn -= t;
t = g;
k = 3;
}
else
{
t -= tn;
tn = 0;
}
}

if (k == 2) {
if (tn >= t) {
tn -= t;
t = r;
k = 1;
}
else
{
t -= tn;
tn = 0;
}
}

if (k == 3) {
if (tn >= t) {
tn -= t;
t = y;
k = 2;
}
else
{
t -= tn;
tn = 0;
}
}
}

switch (k)
{
case 0://如果为道路,直接加上t
time += t;
break;
case 1://如果为红灯,直接加上t
time += t;
break;
case 2://如果为黄灯,加上黄灯剩余时间t后再加上红灯持续时间r
time += t + r;
break;
case 3://绿灯直接通过

break;
default:
break;
}
}

cout << time;

return 0;
}
-------- 本文结束 感谢阅读 --------
相关文章
  • CCF-CSP:201409-3字符串匹配
  • CCF-CSP:201403-3命令行选项
  • CCF-CSP/201312-3最大的矩形
  • CCF-CSP:201403-2窗口
  • CCF-CSP:201403-1相反数
觉得文章写的不错的话,请我喝瓶怡宝吧!😀
SiriYang 微信支付

微信支付

SiriYang 支付宝

支付宝

  • 本文标题: CCF-CSP:201812-2小明放学
  • 本文作者: SiriYang
  • 创建时间: 2020年01月03日 - 13时01分
  • 修改时间: 2021年10月29日 - 18时10分
  • 本文链接: https://blog.siriyang.cn/posts/20200103135249id.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
算法题 CCF-CSP
CCF-CSP:201809-1卖菜
CCF-CSP:201812-1小明上学
  • 文章目录
  • 站点概览
SiriYang

SiriYang

努力搬砖攒钱买镜头的摄影迷
319 日志
33 分类
88 标签
RSS
GitHub E-Mail
Creative Commons
Links
  • 友情链接
  • 作品商铺

  1. 题目
    1. 题目背景
    2. 问题描述
    3. 输入格式
    4. 输出格式
    5. 样例数据
    6. 评测用例规模与约定
  2. 解答
    1. 分析
    2. 代码
蜀ICP备19008337号 © 2019 – 2025 SiriYang | 1.7m | 25:41
0%