【题解】第十二届蓝桥杯(省赛)第一场:C题 直线 C/C++ (两种解法)

您所在的位置:网站首页 蓝桥杯2021年题目 【题解】第十二届蓝桥杯(省赛)第一场:C题 直线 C/C++ (两种解法)

【题解】第十二届蓝桥杯(省赛)第一场:C题 直线 C/C++ (两种解法)

2024-07-09 14:35| 来源: 网络整理| 查看: 265

爱情到来绝不能犹豫。

关注博主容不得迟缓。

题目:

在这里插入图片描述 答案:40257

解析1(改写set): 坑点:

本题目涉及double运算。但是对于浮点运算通常是很危险的。 主要的危险就是:精度损失。

精度损失的含义是,对于double通常存在对末尾的四舍五入。比如在1/10(十进制是0.1)但是在二进制存储却是:0.00011001100110011001100110011001100110011001100110011001 10011… 所以在进行0.1+1.1会出现:1.20000000000000018这样奇怪的答案。 这种答案是致命的,因为这种答案会导致进入set集合的时候。1.2000000000018和1.2被当成两个数字对待。但实际上,1.2000000…完全是精度的问题。所以我们称之位“精度损失”。 (参考文献:https://www.zhihu.com/question/42024389)

所以,我们在设计程序的时候,认为当两个double的差不大于1e-8,我们就认为他们是同一个数。

我们可以改写set集合来完成操作。首先您要知道set实现的大致原理。如果您不知道也没有关系。您可以这样记忆:

重写set的比较函数,当“比较函数”成功,便会执行一种类似的“插入”操作。但是如果比较失败(最终比较失败)就不会插入到这颗树上。(不理解也没有关系。您可以找找“set底层实现原理”这方面的文章参阅。

set是STL里面一个非常常用的数据结构。set使用了一种叫做“平衡二叉树”(红黑树)的结构来实现在O(log)级别进行“查找”和“删除”的操作。具体实现过程请移步别的教材。 set的比较函数一定要注意:必须要有顺序。 也就是:写出return a==b是决定禁止的,因为会出现重复插入,而且插入的位置也变得不确定。所以必须写成ak = x; this->b = y; } }; bool equals(double a, double b) { //改写等于号的规则,我们认为当两个数差的不是特别大,那么就是同一个数。 if (fabs(a - b)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3