由于期末考试的原因,已经有一个月没有写算法题了。
这场abc就作为这一个月过后的康复训练。
~~稍微总结一下这场“康复训练”。
A:When?
题目大意
ABC的开始时间是21:00(JST),给出距离比赛的时间
t
t
t min,求该时刻的时间HH:MM
。
解题思路
考察if分支语句的使用,判断一下
t
<
60
t \lt 60
t<60 的情况,以及
t
≥
60
t \ge 60
t≥60 的情况。
还需要考虑 HH:MM
中 MM
小于10分钟时,需要补0,变成2位数。
B:Number BOX
题目大意
给出一个填有1~9
的数字网格图,网格图的右边界和左边界连接,上边界和下边界连接。
高桥在任意一个格子开始,连续走
N
N
N 步(可以往与当前格子相邻的四个格子以及斜对角上的四个格子移动,一开始选定移动的方向,就必须一直往该方向移动),途中记录下经过格子上的数字,根据经过的先后顺序组合成一个数如
1 -> 3 -> 5 -> 7 得到:1357。
求最大能得到的数字。
解题思路
只能往一个方向走,对于每一个格子作为起点,都只有8钟可能的结果,我们只要对于每一个格子作为起点,遍历所有的可能,然后记录下最大的结果。 O ( N 3 × 8 ) O(N^3 \times 8) O(N3×8) 满足题目对于效率的要求。
C:Rotation
题目大意
给出一个字符串,以及对于这个字符串的操作和询问:
1 x
将“字符串末尾的字符移动到字符串开头”这样的操作重复x次。2 x
· 求当前字符串的第x个字符
按照顺序完成这些操作和询问。
解题思路
由于题目只要求输出字符串中指定位置的一个字符,设给定的字符串首尾相接。
对于操作1,每一次这样的操作就相当于把字符串的起始位置往前移动x个字符。
比如 字符串(>代表起始位置)>atcoder : 执行操作1,3次,变为deratco
相当于将起始位置往前移动x个字符 atco>der。(字符串首尾相接)
对于询问2,只要输出从起始位置开始的第x个字符即可。
D:Trophy
题目大意
有
1..
N
1 .. N
1..N ,
N
N
N 个关卡,每个关卡有
A
i
A_i
Ai 分钟的CG动画,以及
B
i
B_i
Bi 分钟的通关必要时间。
打完第
i
i
i 个关卡,
i
+
1
i + 1
i+1 个关卡才会解锁,第1关一开始就解锁了。
第一次通过某个关卡需要观看CG动画,才能进入关卡。否则可以直接跳过CG动画,进入关卡。
问通关任意关卡
X
X
X次,最少需要多少时间(同一个关卡可以通关多次)。
解题思路
题目要求我们必须从第1关开始,依次解锁关卡通关。
如果没有一开始关卡
2..
N
2..N
2..N 都是锁定状态的这个限制,我们只要找到
A
i
(
附
加
时
间
)
+
X
×
B
i
A_ i(附加时间) + X \times B_i
Ai(附加时间)+X×Bi 这个值最小的关卡即可。
现在,题目要求我们如果要通关第
i
i
i 个关卡,必须通关过
1..
i
−
1
1..i-1
1..i−1 这些关卡。
此时,通关第
i
i
i 个关卡的附加时间变成了
∑
k
=
1
i
−
1
(
A
k
+
B
k
)
+
A
i
\sum_{k=1}^{i - 1}(A_k +B_k) + A_i
∑k=1i−1(Ak+Bk)+Ai。
我们需要寻找
∑
k
=
1
i
−
1
(
A
k
+
B
k
)
+
A
i
+
(
X
−
(
i
−
1
)
)
×
B
i
\sum_{k=1}^{i - 1}(A_k +B_k) + A_i + (X - (i - 1))\times B_i
∑k=1i−1(Ak+Bk)+Ai+(X−(i−1))×Bi 的最小值。
E:Packing Potatoes
题目大意
有无限多个土豆,第
i
i
i 个土豆重
W
i
M
o
d
N
W_{i ~~ Mod ~~ N}
Wi Mod N, 从第一个土豆开始,依次装入箱子中,当一个箱子中的土豆重量之和超过
X
X
X 高桥就会换一个箱子。
现在有
Q
Q
Q 组询问,询问第
K
i
K_i
Ki 个箱子中土豆的个数
解题思路
预处理
W
1..
N
W_{1..N}
W1..N 的前缀和,从第一个土豆开始,我们可以通过二分查找(lower_bound)快速定位到下一个箱子的第一个土豆的重量以及接下来要放的土豆是哪些,以及这个箱子放了多少个土豆。
接下来的箱子,也使用二分查找的方法,来确定当前箱子放的土豆个数以及下一个箱子放的土豆。
通过上述操作,我们可以发现,每个箱子放的土豆个数
C
n
t
i
Cnt_i
Cnti 存在循环,即两个箱子中放的所有土豆编号
i
M
o
d
N
i~Mod~N
i Mod N完全相同,那么这两个箱子中间所有箱子的土豆个数
C
n
t
i
Cnt_i
Cnti 是一个循环节。
由于循环节的长度一定小于或者等于
N
N
N,所以我们一定能够找出
C
n
t
i
Cnt_i
Cnti 的循环节。
有了
C
n
t
i
Cnt_i
Cnti 的规律,对于任意
K
i
K_i
Ki ,我们都能快速知道
K
i
K_i
Ki 个箱子中的土豆个数
C
n
t
K
i
Cnt_{K_i}
CntKi 。
代码<<< 戳此看代码 (^ ^)。
总结
一个月没有写代码,熟练度果然下降了不少,B题由于看错题意卡了好久,C题一开始对于操作1 x
, 的理解出现了偏差,将起始位置 beg_ptr 后移了 x 位。D题忘记对于
X
<
i
X < i
X<i
的情况需要退出。总体难度 E > B > D > C > A