信息竞赛中的一些算法:深度优先搜...

物理
信息竞赛中的一些算法:深度优先搜索、字典序和“自动高精度”

用户头像
IOIAKME 更新于2025-7-12 12:36:53

这是一个关于信息竞赛的帖子。

$A\to B$ 表示把 $A$ 的值设为 $B$。

$a[i]$ 表示数组 $a$ 的第 $i$ 项。

$i$ 除非特殊说明,不指虚数单位。

某些词语可能使用不规范,请大家指出。

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

张阿姨说:我的孩子说要学“深度优先搜索”,怎么能依赖于搜索呢?有问题应该自己解决。

赵先生说:我孩子要学“深度优先搜索”,这东西一看就很深奥,怎么能让初中生学呢?

孙女士说:我孩子最近在做什么“高精度”的题,怎么能让孩子算精度要求怎么高的东西呢?算错了怎么办?

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

$\Huge{\text{一:深度优先搜索}}$

下图是一个树,如何遍历每个节点呢?

[图一]

可以按照图片中数字顺序。

这就是深度优先搜索的顺序。

题目:已知一些数 $a_1\lt a_2\lt\dots\lt a_n$。

已知 $s$,如果 $\sum_{j=1}^ma_{i_j}=s$,求 $i_j$。

如果有多种可能,输出字典序最小的可能。

如果不可能,输出 $\texttt{impossible is nothing}$。

为了防止骗分,有 $N$ 组数据。


深度优先搜索与$\sout{地柜}$递归有异曲同工之妙,深度优先搜索同样也是把复杂的问题拆分成小问题。

比如我们选择了 $1$ 号节点,我们接下来就要搜索 $2$ 号节点和 $3$ 号节点的子节点。


例如这道题,我们可能会选择尝试 $\frac{s}{a_1}$ 能不能这么分解。当然也有可能不能,如果不能,就尝试 $\frac{s}{a_2}$,一直到成功为止。

当我们尝试 $\frac{s}{a_1}$ 能不能这么分解时,应该尝试 $\frac{s}{a_1^2}$ 能不能这么分解、$\frac{s}{a_1a_2}$ 能不能这么分解……直到成功。

当我们尝试 $\frac{s}{a_{c_1}a_{c_2}\dots a_{c_m}}$ 能不能这么分解时,应该尝试 $\frac{s}{a_{c_1}a_{c_2}\dots a_{c_m}a_1}$、$\frac{s}{a_{c_1}a_{c_2}\dots a_{c_m}a_2}$、……、$\frac{s}{a_{c_1}a_{c_2}\dots a_{c_n}a_n}$ 能不能分解。

当然,如果中间某一次尝试成功了,接下来就不必再试了,否则会 TLE。


代码会放在评论区。


$\Huge{\text{二:字典序}}$

顾名思义,就是字典中的顺序。

对于两个排列 $a_1,a_2,\dots,a_n$ 和 $b_1,b_2,\dots,b_m$ 且 $n\ge m$,

如果 $a_1\gt b_1$,则 $a$ 的字典序更大;如果 $a_1\lt b_1$,则 $b$ 的字典序更大。

如果 $a_1=b_1$,且 $a_2\gt b_2$,则 $a$ 的字典序更大;如果 $a_2\lt b_2$,则 $b$ 的字典序更大。

如果 $a_1=b_1,a_2=b_2$,且 $a_3\gt b_3$,则 $a$ 的字典序更大;如果 $a_3\lt b_3$,则 $b$ 的字典序更大。

……

如果 $\forall i\in\mathbb{N^+},i\ge m,a_i=b_i$,则 $a$ 的字典序更大。


$\Huge{\text{三:“自动高精度”}}$

大家知道,蟒蛇语言(Python)默认的整数类型就是高精度。所以如果有高精度题目,可以直接用它做。

大家也知道,蟒蛇语言的运行速度很慢。面对这种情况,有两种解决方案。

第一种是改用爪哇语言(Java),它也有高精度类型。

第二种是换一个解释器。人们看到它运行速度这么慢,于是又做了一些更快的解释器。

例如 Pypy(可以在洛谷上用)、Cython 等。

收起
10
8
共6条回复
时间正序
用户头像
(流)星
4天前

帖主我是学C++的,能补充点吗?(要是我下面讲错了提醒下我会删评的

额搜索应该是分为深度优先搜索和广度优先搜索

帖主看下呗

IMG_20250709_173024_416.jpg


5条评论
用户头像
IOIAKME
4天前

可以,看起来都是对的

用户头像
Silicon(硅)『对酒当歌』
2天前

注意:广度优先搜索只能解决权值相同的问题

用户头像
Silicon(硅)『对酒当歌』 回复 IOIAKME
2天前

你详细介绍一下树(包括二叉树)、图呗

用户头像
IOIAKME 回复 Silicon(硅)『对酒当歌』
2天前

不会。

用户头像
Silicon(硅)『对酒当歌』 回复 IOIAKME
1天前

那我帮你咯

用户头像
‫‫
3天前

题目:

暑假到了,小信终于可以大刷特刷之前积攒的题了。

但是由于小信的题单题目实在太多了,他并不打算把所有题都刷完,他决定给每道题目贴上一个 X 或者 Y 的标签:

  • 小信必须按照题目顺序从第 1 题开始刷。

  • 当小信刷完一道 Y 的题目后,必须按顺序刷下一道题,如果该题是最后一题,则结束刷题。

  • 当小信刷完一道 X 的题目后,他可以继续按顺序刷下一道题,也可以跳过下一道题,直接刷下下道题。

  • 题单的最后一题标签必须是 Y 。

根据上述规则,小信有很多种不同的方法完成题单。比如说,他按照 YXXY 的标签顺序来刷题,一共有3种不同的方法来完成:全部做完,跳过第三题和跳过最后一题。

现在小信想要知道该如何给他题单里的题目贴上标签,使得最终一共有 N 种方法来完成他的题单。

代码:

#include <iostream>
using namespace std;
long long fib[70];
string ans;
int f = 0;

string st(string c, int n) {
    string r = "";
    for (int i = 0; i < n; i++) {
        r += c;
    }
    return r;
}

int DFS(long long n) {
    if (n == 1) return 1;
    if (f == 1) return 1;
    for (int i = 69; i >= 3; i--) {
        if (n % fib[i] == 0) {
            if (DFS(n / fib[i])) {
                ans = st("X", i - 2) + "Y" + ans;
                f = 1;
                return 1;
            }
        }
    }
    return 0;
}

void init() {
    fib[0] = 0;
    fib[1] = 1;
    for (int i = 2; i < 70; i++) {
        fib[i] = fib[i - 1] + fib[i - 2];
    }
}
int main() {
    init();
    int t;
    cin >> t;
    for (int _ = 0; _ < t; _++) {
        long long N;
        f = 0;
        ans = "";
        cin >> N;
        DFS(N);
        if (f) {
            cout << ans << endl;
        } else {
            cout << "IMPOSSIBLE\n";
        }

    }
}
1条评论
用户头像
衍.
2天前

怎么都学c++了😅

用户头像
Silicon(硅)『对酒当歌』
2天前

更新了?

不是,你怎么不讲高精度实现方法呢?

6条评论
用户头像
IOIAKME
2天前

高精度乘法需要傅里叶变换,我没学过……

下次我决定讲快速幂

用户头像
Silicon(硅)『对酒当歌』 回复 IOIAKME
2天前

需要吗???

用户头像
Silicon(硅)『对酒当歌』 回复 Silicon(硅)『对酒当歌』
2天前

请问你在列竖式计算乘法时需要用到傅立叶变换???

搞笑的吧

高精度就是用数组模拟列竖式计算(我说的是通用算法)

用户头像
世界是一条巨大的章鱼对吗 回复 IOIAKME
2天前

对啊,高精度就是用数组模拟一位一位相乘

用户头像
IOIAKME 回复 世界是一条巨大的章鱼对吗
2天前

那样太慢了

用户头像
世界是一条巨大的章鱼对吗 回复 IOIAKME
1天前

所以说C++就是依托啊,明明是垃圾语言,却因为竞赛要用必须学

用户头像
杂七杂八的小杂鱼
2天前
你觉得我要是把你的动规分析成好多板块咋样,比如,区间类动规,树形动规,数位动规,状态压缩动规,单调队列动规,斜率优化动规等
1条评论
用户头像
‫‫
1天前

可以。

用户头像
117我恨你
2天前
能讲下洪水填充吗,我们那年第一轮出了这个很有意思我觉得
5条评论
用户头像
IOIAKME
2天前
发一下题目描述
用户头像
Silicon(硅)『对酒当歌』
2天前

到时候我打算做一个算法大全(参考一下@IOIAKME应该可以吧)

用户头像
‫‫ 回复 Silicon(硅)『对酒当歌』
2天前

我是@IOIAKME 的小号,帮他回答一下:如果参考我的帖子请注明原作者(我)

用户头像
Silicon(硅)『对酒当歌』 回复 ‫‫
2天前

直接引用帖子可以吧

用户头像
‫‫ 回复 Silicon(硅)『对酒当歌』
2天前

标注这是我写的就行了

用户头像
Amadeus
1天前

之前做过一道高精度除法的题,一生的恶梦20.png

2条评论
用户头像
:P
1天前

乘法我就已经不行了...

用户头像
Silicon(硅)『对酒当歌』
1天前

高精度除高精度我至今还没研究明白