zoukankan      html  css  js  c++  java
  • 黑书之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的一条直线,要使其斜率最大,那么一定存在于相邻两点之间。反证法:假设存在一条直线的倾角最大,但是中间还存在其他的在该直线下方的点,那么一定可以得出存在一条倾角更大的直线,将直线下方的点与一端点的连线倾角更大,故假设错误。

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

  • 相关阅读:
    Extjs5.0中的新特性
    Extjs4中的常用组件:Grid、Tree和Form
    Extjs4中的布局
    Extjs4中的store
    [IIS]IIS扫盲(三)
    [IIS]IIS扫盲(二)
    [IIS]IIS扫盲(一)
    [IIS]在CMD中IIS的使用
    检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败
    [SQL]向3个表插入数据的存储过程 和 C# 代码
  • 原文地址:https://www.cnblogs.com/xiaoshen555/p/3876757.html
Copyright © 2011-2022 走看看