zoukankan      html  css  js  c++  java
  • 周长最长分析

    原题

    n根长度不一的棍子,判断是否有三根棍子可以构成三角形,并且找到周长最长的三角形。

    分析

    首先能够构成三角形的三根棍子需要满足什么条件呢?这个简直就是常识了:

    最长棍子的长度 < 另外两根棍子的长度和

    这是重要条件。

    那么接下来该怎么办呢?暴力法——不要总觉得这是耻辱,要这样想:这是一个好开端。三条边,三层循环。时间复杂度为O(n^3)。这在一般的题目中,都是无法接受的。如何改进的呢?棍子有长有短,我们要找到的是周长最长的。

    我们可以对棍子的长度,从大到小排序。从最长的开始找符合构成三角形条件的。找到的第一个就是周长最长的。

    下面我们来说明,为什么第一个找到的,就是最长的。假设我们有如下长度的棍子,并且长度一次递减。

    a b c d e f g

    假设opq是第一个可以构成三角形的棍子,假设还存在xyz,构成三角形,且,x+y+z > o + p + q, 因为opq是第一个三角形,则x<=o。则y+z > p+q,任取y、z,则可以找到,o,y,z为一个三角形,周长大于opq,并且,这个三角形,在opq之前找到(因为y或者z,大于p或者q,先遍历到)。这个与adf是第一个的假设是矛盾的。所以,不存在xyz构成三角形,周长大于adf。

    那么如果找到第一个能够构成三角形的三根棍子呢?现在棍子的长度已经是排序的。

    a b c d e f g

    很明显,我们只需要依次考虑,相邻三个元素是否能够构成三角形即可。因为,如果acd构成三角形,abc一定是,而且,周长还要更长。所以这里O(n),就可以找到周长最长的三角形。前面排序是O(nlogn)。则,总的时间复杂度是O(nlogn).

  • 相关阅读:
    VS2010 使用TeeChart画图控件
    程序猿接私活经验总结,来自csdn论坛语录
    锁(下)
    android4.4组件分析--service组件-bindService源代码分析
    黑客和敏捷开发
    编写你自己的单点登录(SSO)服务
    Cloudera impala简单介绍及安装具体解释
    ACdream群赛1112(Alice and Bob)
    八大排序算法总结
    垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
  • 原文地址:https://www.cnblogs.com/downtjs/p/3534746.html
Copyright © 2011-2022 走看看