2024天梯赛校内选拔赛-民间题解

发布时间:2024-03-16 22:01:44
贴主:Silencer76
热度:21

Silencer76 2024-03-16

比赛地址:2024天梯赛校内选拔赛 。

------------------------------------

第1题 Happy new year!

直接输出即可。

第1题代码

------------------------------------

第2题 勾股定理

在头文件 <cmath> 里面有一个函数 hypot ,给定两个直角边长,返回斜边长。

第2题代码

------------------------------------

第3题 最小值在哪

把九宫格视为一个一维数组,然后使用 min_element 函数得到最小值所在的地址,减去数组首地址就是下标。

最后输出下标对应的字符串。

第3题代码

------------------------------------

第4题 三角形类型

分类讨论,先判断是不是三角形,然后判断是不是等腰三角形,最后判断是不是等边三角形。

第4题代码

------------------------------------

第5题 压缩编码

开一个同等长度的 int 数组,遍历该字符串。

第一位默认是 1 。

如果前一位的字符和当前位置的字符相同,那么当前位置继承前一位的数字,并 +1 ,前一位清零。

如果不同,当前位置设为 1 。

最后再次遍历该数组,如果某个位置的数字不为 0 ,则输出位置对应的字符,以及数字。

第5题代码

------------------------------------

第6题 数组排序

由题意有 r-l+1<n ,则可以贪心的选择 r-l+1 = n-1 。

所以排序的区间是 [1,n-1] 或者 [2,n] 。

那么,只要保证 a[n] 是数组中的最大值,或者 a[1] 是数组中的最小值,即可输出 YES。

否则,输出 NO 。

第6题代码

------------------------------------

第7题 旋转密码锁

首先通过埃氏筛选法,把 [0,99999] 中的素数筛出来。

然后进行 bfs ,过程较为繁琐。

第7题代码

------------------------------------

第8题 划分数组

使用两个 map ,一个正着枚举,一个反着枚举,对次数进行预处理。

枚举的时候,使用一个变量来维护次数的最大值,然后填入数组里。

相当于维护了一个前缀最大数组和一个后缀最大数组。

最后 o(n) 遍历,只要相邻两个元素值都小于等于 k 即可输出 YES 。

否则,输出 NO 。

第8题代码

------------------------------------

第9题 巨魔时间到

个人认为这是本场最难的题目。

将 小时 统一转化为等价的 分钟,将会使代码构建更加方便。

首先,对所有的限制时间段进行排序,然后 o(n) 预处理。

预处理中,我们需要把能合并的区间进行合并。

当且仅当 区间的左边界 小于等于 上一个区间的右边界+1 时,可以合并。

注意到合并后,右边界可能发生变化(区间相交),也可能不发生变化(区间包含)。

预处理结束后,将所有合并后的区间存进 map 中。

map 的每个 key 代表左边界,value 代表右边界。

对于每次查询,我们在 map 上找严格大于此时间点的左边界(upper_bound)。

如果这个左边界是 map 的第一个元素,说明巨魔在敌人开展任意限制之前就已偷塔成功。

否则,对这个迭代器-1,即找到上一个限制的区间。

如果查询的时间点比区间的右边界大,说明时间点在两段限制区间的缝隙里面,可以偷塔。

否则,巨魔无法完成任务。

第9题代码

------------------------------------

第10题 删除括号

为了方便输出,使用两个 vector 来模拟 栈 。

首先 o(n) 遍历,找到光标位置,光标左边的字符存进第一个 vector 里面,右边的存进另一个里面。

预处理结束后,将存储右边字符的 vector 进行倒置,保证两个 vector 的尾部都是光标相邻的位置。

然后进行操作,< 就是把左边 vector 尾部字符扔掉右边,> 同理。

DELETE 和 BACKSPACE 除了删除字符,还需要判断对应的另一个 vector 是否有匹配字符。

如果有,就同步删除。

以上操作都需要判断 vector 里面是否有字符可以操作,非法访问会造成 runtime error 。

最后输出之前,把存储右边字符的 vector 倒回来。

第10题代码

------------------------------------

第11题 金字塔

先 o(n) 预处理每个数字跟相邻的关系,然后进行模拟。

如果两边都能走,那么贪心地选择最小的那个值,这样能拉低平均值。

否则,选择能走的那边。

考虑到单调性,每个数字仅可能被访问 3 次。

所以模拟的时间复杂度仍是 o(n) 。

第11题代码

------------------------------------

第12题 困住罗少

开两个数组 a 和 b ,表示点的状态。

数组 a 标记点的最终走向,默认值为 0 ,死胡同为 1 ,环为 2 。

数组 b 标记点的访问情况,默认值为 false ,访问过为 true 。

对每个点进行 dfs ,如果被访问过,直接返回最终走向。

否则,递归访问子节点,直到没有子节点,或者访问到曾经访问过的节点。

如果某节点出度为 0 ,返回 1 。

如果子节点中有环,返回 2 。

如果上述都不满足,返回 1 。

那么,如何判环呢?

假设对于某节点 now 而言,其中的一个子节点是 x ,那么成环的必然条件是:

1. b[x]=true

2. a[x]!=1

a[x]=0 时,代表本轮 dfs 中, x 从另一条路径走到了 now ,并且即将走回 x 。

a[x]=2 时,代表 x 在前面几轮 dfs 已经走向了环。

如果节点 now 的其中一个子节点 x ,有 a[x]=2 ,则子节点会感染父节点 a[now]=2 。

每次递归将 a[now] 返回,如有感染,也会感染回去。

最终判断有多少个 a[now]=1 ,输出数量。

第12题代码


(11)

Akanecco 2024-03-16

(4)

易向晚来适 2024-03-17

(3)

Copyright 2016 - 2024 XUJC ACM Team
闽ICP备2020022076号-1