首页 > 代码库 > 黑书之1.2.6:离散数学
黑书之1.2.6:离散数学
题目描述:有一个函数,它的定义域:1 to N(2<=N<=100000),值域f(n)为long int(in C++)(最后证明在-2^31—2^31)。要求函数上的两个点a,b使得当x∈(a,b)函数f,在直线ab的下方,并且要求ab的倾角最大。
根据黑书所说,O(n^2)的算法确实是很容易相出,但是存在一种O(n)算法。想了许久都不能明白,中间确实想到过最终的解法,但是没有仔细想,故没有证明其正确性,最终没有相处此题。
根据网上的同道中人所述,写出算法:
从左到右扫描,O(n)的时间,计算相邻两点之间的斜率,最后选出最大斜率的一对即为所求的结果。
算法正确性证明很简单:
1.相邻亮点之间的连线一定满足任意中间的点都在直线的下方的条件。
2.倾角最大,先理解为斜率最大的意思。可以证明出结论:只要存在满足条件1的一条直线,要使其斜率最大,那么一定存在于相邻两点之间。反证法:假设存在一条直线的倾角最大,但是中间还存在其他的在该直线下方的点,那么一定可以得出存在一条倾角更大的直线,将直线下方的点与一端点的连线倾角更大,故假设错误。
由上面的证明可以得出,所要求的结果一定存在于相邻两点之间。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。