主页
搜索
最近更新
数据统计
赞助我们
系统公告
1
/
1
请查看完所有公告
[NOI2016] 旷野大计算 如何在造计算机题中快速拿分
最后更新于 2025-06-15 18:10:54
作者
Ignotus
分类
个人记录
复制 Markdown
查看原文
更新内容
前两个点直接按照题意和给出的函数模拟,可以拿到 $20$ 分。 第三个点直接将 $a$ 与 $0$ 用比较节点进行比较可以获得 $6$ 分。 但我们发现 $S$ 函数的出现必然是有意义的。因为 $x\rightarrow +\infty$ 时 $S(x)=1$,$x\rightarrow -\infty$ 时 $S(x)=0$,$x=0$ 时 $S(x)=0.5$,并且题目允许一定的精度误差,所以我们可以直接将输入的 $a$ 扩大足够多倍后取 $2S(a)-1$ 的值。可以获得 $10$ 分。 第四个点不是很容易,那我们就先用一个 $\max$ 节点,直接取 $\max(a,-a)$,$6$ 分跑路。 第五个点只需要实现一个类似正常快读的东西,每次多读进来一位加到当前的值上并左移一位,精细实现一下即可获得 $10$ 分。 第六个点可能不是非常直接,但我们可以想一些普遍的做法,然后尝试用题目中给出的运算解决。我的做法是,读入一个数后,从高到低确定这个数第 $i$ 位是什么,再将这个数第 $i$ 位减掉,递归到子问题处理。 现在我们的问题是确定一个数最高位是否为 $1$,我们可以将其右移至只有最高位在整数部分,将右移后的数减去 $1-\epsilon$ 后判断其是否为正,这部分可以直接参考第三个点的做法。这样可以获得 $8$ 分。 第七个点将第五、六个点缝合起来,再加上一个一位的异或运算。我们发现异或并不好做,但好在对于一个二进制位有 $a\operatorname{xor} b=|a-b|$,我们可以使用 $\max$ 节点计算绝对值,在这个点获得 $5$ 分(第六个点实现丑了,需要的节点数比较多)。 第八个点因为精度误差要求不是很严格,所以可以直接将 $\frac{1}{10}a$ 二进制前 $40$ 位求出来,再加到一起。可以获得 $9$ 分。 第九个点考虑冒泡排序,直接遍历所有数对 $(i,j)$,并在每次操作将 $(a_i,a_j)$ 变成 $(\min\{a_i, a_j\}, \max\{a_i, a_j\})$。使用 $\max$ 节点可以获得 $6$ 分。 第十个点需要乘法和取模,不容易快速做出,可以放弃。 综上,我们只用最基础的知识,使用 $S$ 函数最基本的性质,每个子任务都直接寻求最简单最直观的解法,就可以在 $1$ 小时左右的时间内轻松拿到 $74$ 分,这在考场上已经是比较可观的分数,完全可以到此为止,去思考其它题目。 完整题解?有点浪费时间,摆了。
正在渲染内容...
点赞
1
收藏
0