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

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

用户头像
____ 更新于2025-8-18 00:25:03

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

$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 等。

收起
11
9
共4条回复
时间正序
用户头像
世界是一个巨大的对吗
1月前

题目:

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

但是由于小信的题单题目实在太多了,他并不打算把所有题都刷完,他决定给每道题目贴上一个 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条评论
用户头像
旧谣·念長安
1月前

怎么都学c++了😅

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

更新了?

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

6条评论
用户头像
____
1月前

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

下次我决定讲快速幂

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

需要吗???

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

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

搞笑的吧

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

用户头像
一条大章鱼 回复 ____
1月前

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

用户头像
____ 回复 一条大章鱼
1月前

那样太慢了

用户头像
一条大章鱼 回复 ____
1月前

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

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

可以。

用户头像
我的浮木已经似了
1月前
能讲下洪水填充吗,我们那年第一轮出了这个很有意思我觉得
5条评论
用户头像
____
1月前
发一下题目描述
用户头像
Silicon(硅)『对酒当歌』
1月前

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

用户头像
世界是一个巨大的对吗 回复 Silicon(硅)『对酒当歌』
1月前

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

用户头像
Silicon(硅)『对酒当歌』 回复 世界是一个巨大的对吗
1月前

直接引用帖子可以吧

用户头像
世界是一个巨大的对吗 回复 Silicon(硅)『对酒当歌』
1月前

标注这是我写的就行了