-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2018-12-T2.cpp
150 lines (146 loc) · 3 KB
/
2018-12-T2.cpp
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/**
* Author: Bao Wenjie
* Email: [email protected]
* Date: 2020/8/18
*/
//题目背景
//
//汉东省政法大学附属中学所在的光明区最近实施了名为“智慧光明”的智慧城市项目。
//具体到交通领域,通过“智慧光明”终端,可以看到光明区所有红绿灯此时此刻的状态。
//小明的学校也安装了“智慧光明”终端,小明想利用这个终端给出的信息,估算自己放学回到家的时间。
//
//问题描述
//一次放学的时候,小明已经规划好了自己回家的路线,并且能够预测经过各个路段的时间。
//同时,小明通过学校里安装的“智慧光明”终端,看到了出发时刻路上经过的所有红绿灯的指示状态。
//请帮忙计算小明此次回家所需要的时间。
//
//输入格式
//
//输入的第一行包含空格分隔的三个正整数 r、y、g,表示红绿灯的设置。
//这三个数均不超过 106。
//输入的第二行包含一个正整数 n,表示小明总共经过的道路段数和路过的红绿灯数目。
//接下来的 n 行,每行包含空格分隔的两个整数 k、t。
//k = 0 表示经过了一段道路,将会耗时 t 秒,此处 t 不超过 106;
//k = 1、2、3 时,分别表示出发时刻,此处的红绿灯状态是红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 t,此处 t 分别不会超过 r、y、g。
//
//输出格式
//
//输出一个数字,表示此次小明放学回家所用的时间。
//
//样例输入
//
//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 ≤ 103。
//* 所有测试点保证 n ≤ 105。
#include <iostream>
#define MAXN 105
using namespace::std;
int main()
{
int r, y, g;
int ryg;
int sum = 0;
int n, index, time;
cin >> r >> y >> g;
ryg = r + y + g;
cin >> n;
for (int i(0); i < n; i++)
{
cin >> index >> time;
// 红灯
if (index == 1)
{
time = (r - time + sum) % ryg;
if (time >= 0 && time < r)
{
// 红灯
time = r - time;
sum += time;
}
else if (time >= r && time < r + g)
{
// 绿灯
continue;
}
else
{
// 黄灯
time = ryg - time + r;
sum += time;
}
}
// 黄灯
else if (index == 2)
{
time = (y - time + sum) % ryg;
if (time >= 0 && time < y)
{
// 黄灯
time = y - time + r;
sum += time;
}
else if (time >= y && time < r + y)
{
// 红灯
time = r + y - time;;
sum += time;
}
else
{
// 绿灯
continue;
}
}
// 绿灯
else if (index == 3)
{
time = (g - time + sum) % ryg;
if (time >= 0 && time < g)
{
// 绿灯
continue;
}
else if (time >= g && time < g + y)
{
// 黄灯
time = g + y - time + r;
sum += time;
}
else
{
// 黄灯
time = ryg - time;
sum += time;
}
}
else
{
sum += time;
}
}
cout << sum << endl;
return 0;
}