原题传送门
题意简述滑道长度为 (N+2),编号从 (0) 到 (N+1),其中:
(S0 = S{N+1} = \texttt{x}):两端为墙。
(S_1 \sim S_N):可能是字母、. 或 #。
棋子初始在位置 (A),方向向右,且 (S_A) 是字母。
每秒棋子向当前方向移动一格,规则如下:
落在 x:反转方向。
落在 #:反转方向 + 变为 .(只触发一次)。
落在 .:无变化。
目标:清除所有 # 所需的时间。
解法思路核心观察每个 # 只能清除一次,且每次清除都会反转方向。棋子在滑道上来回穿梭,形成“往返”路径。
分治策略将所有 # 分为左右两部分:
左侧:位置 (< A)
右侧:位置 (> A)
每次向当前方向移动到最近的 #,清除后反转方向。若当前方向没有 #,则先移动到端点,再转向另一侧。
简洁代码(码风优良)`#include
include include include using namespace std;
int main() { ios::sync_with_stdio(0); cin.tie(0);
in ...
原题链接
前言由于开了学术模式,也没看算法标签和难度,于是直接选择了BFS。
BFS思路由于每走一步的路径长度都为 $1
1$<span class="mord">1 ,也就是说明当前路径长和访问序列的顺序是相同的,题目要求最短路,也就是最短路径是最早到达的路径。
这就正好符合了队列(queue)的FIFO(先进先出)的性质。
众所又周知,BFS以及和BFS相同思路的图论算法都和队列相关。比如01BFS使用的deque(双端队列),Dijkstra(著名单源最短路算法)的priority_queue(优先队列)。
所以,这道题的BFS思路就呼之欲出了(致DFS老祖,触雷致歉),BFS是 $O
(
n
)
O(n)$<span style="margin-right: 0.0278em;" class="mord mathnormal">O<span class="mopen">(<span class="m ...
1. 算法设计动机在大规模数据处理中,“从规模为 (n) 的集合中选取前 (k) 小元素”是一类高频需求。 现有主流方法如 nth_element 在 𝑘≪𝑛时会对大量无关元素执行比较与交换,浪费缓存与分支资源。 本算法通过逐级直方图前缀细化,在常数次扫描后将候选规模压缩至接近 (k),再用局部选择获得结果,整体常数因子低、缓存友好。
2. 算法原理概要
键值规范化:将比较键映射为 32 位单调无符号整数,确保字节顺序与数值顺序一致。
多层直方图细化:从最高字节开始分桶,找到覆盖第 (k) 个元素的边界桶,逐字节递归细化。
候选集压缩:确定部分 + 边界桶组成候选集,大小通常不超过 (1+𝛽)𝑘。
局部选择收尾:在候选集中用 nth_element 得到精确前 (k)。
3. C++20 实现`#include using namespace std;
/**
将有符号 int32 转换为可按无符号比较的单调 uint32
核心思想:翻转符号位,使负数映射到较小的无符号范围*/static inline uint32_t order_key_int32(int32_t ...
题解:P13710 [NWERC 2023] Klompendans原题链接
这一道题,当我看到题目描述的那张图是,就知道是一道标准的搜索。
众所周知搜索分为Breadth-First Search和Depth-First Search(小装一波)。
这道题的类型属于BFS,但是天生反骨的我用的是DFS,但还是有原因的,见下:
题意解释这道题要求从一个n*n的矩阵的左上角开始,有两种运动方法:
1.从当前瓷砖移动到一个距离当前瓷砖沿一个轴方向 a 格、另一轴方向 b 格的瓷砖。注意:题目没有限定对印的轴和正负移动方向,故达成题目中说的8种方法 (感谢豆包为我答疑解惑), 代码如下(pair的第一个值表示x轴,第二个表示y轴):
`mova[0] = {a, b};mova[1] = {a, -b};mova[2] = {-a, b};mova[3] = {-a, -b};mova[4] = {b, a};mova[5] = {b, -a};mova[6] = {-b, a};mova[7] = {-b, -a};1234567891011121314151617181920212223 ...
