黑书之1.2.6:离散数学

题目描述:

有一个函数,它的定义域:1 to N(2<=N<=100000),值域f(n)为long int(in C++)(最后证明在-2^312^31)。要求函数上的两个点a,b使得当x∈(a,b)函数f,在直线ab的下方,并且要求ab的倾角最大。

根据黑书所说,O(n^2)的算法确实是很容易相出,但是存在一种O(n)算法。想了许久都不能明白,中间确实想到过最终的解法,但是没有仔细想,故没有证明其正确性,最终没有相处此题。

根据网上的同道中人所述,写出算法:

从左到右扫描,O(n)的时间,计算相邻两点之间的斜率,最后选出最大斜率的一对即为所求的结果。

算法正确性证明很简单:

1.相邻亮点之间的连线一定满足任意中间的点都在直线的下方的条件。

2.倾角最大,先理解为斜率最大的意思。可以证明出结论:只要存在满足条件1的一条直线,要使其斜率最大,那么一定存在于相邻两点之间。反证法:假设存在一条直线的倾角最大,但是中间还存在其他的在该直线下方的点,那么一定可以得出存在一条倾角更大的直线,将直线下方的点与一端点的连线倾角更大,故假设错误。

由上面的证明可以得出,所要求的结果一定存在于相邻两点之间。

原文地址:https://www.cnblogs.com/xiaoshen555/p/3876757.html