三角形的周长

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

有n根棍子,棍子i的长度为ai,想要从中选出3根棍子组成周长尽可能长的三角形。请输出最大的周长,若无法组成三角形则输出0。

Input:

输入包含多组测试,每组测试第一行输入一个整数n(3≤n≤10^5);第二行输入n个整数ai(1≤ai≤10^6);

Output:

对于每组测试,输出一个数字,表示最大周长,如果无法组成三角形,则输出0。

Sample Input:

5
2 3 4 5 10
4
5 4 20 10

Sample Output:

12
0
解题思路:这是《挑战程序设计竞赛(第二版)》里的一道题,书中说了一种解法O(n³),另外,还特意说明另有一种O(nlogn)的解法,留给读者思考。但对于此题来讲,由于给出n的范围最大值是10^5,所以不能用O(n³),而应该用O(nlogn)的解法。
我们知道组成三角形的充要条件是:最长的边小于其余两边之和;不难想到,可以三重循环枚举所有的选择方案,再判断能否组成三角形,最后找出最大的周长即可。不过此算法时间复杂度太大,会超时!
另一种方法是先把棍子进行排序,然后只比较相邻的三个棍子,最后选择最大的周长。这样只需一次循环即可。为什么这样就可行?理由:假如棍子已经升序排序了,有a<b<c<d,如果有a+b>c且a+b>d,程序中并没有比较a+b和d,那么是否会漏掉这种情况导致错误呢,不会的,因为如果a+b>d的话,那么b+c也一定大于d,而a+b又小于b+c,所以a+b和d后面的数的比较是多余的,而且若这两种情况同时成立,我们也只能取后一种的情况,因为要得到最长的周长!!!这样就只需比较相邻的三个棍子即可。
 #include<bits/stdc++.h>
using namespace std;
int a[],n;
int main(){
while(cin>>n){
for(int i=;i<n;++i)
cin>>a[i];
sort(a,a+n);//默认升序排序
int ans=;
for(int i=;i<n-;++i){
int len=a[i]+a[i+]+a[i+];//三角形的周长
if(a[i]+a[i+]>a[i+])ans=max(ans,len);//证明出来的结论
}
cout<<ans<<endl;
}
return ;
}

最新文章

  1. JavaScript学习笔记(四)——jQuery插件开发与发布
  2. IE9父容器overflow:auto时,子容器状态更改导致滚动条下出现额外空间的问题探讨
  3. HTML表格边框的设置小技巧
  4. 快速傅里叶变换FFT学习小记
  5. IP地址更改小工具(bat命令)
  6. 用php输入表格内容
  7. 怎么使用PHP获取用户客户端真实IP的解决方案呢?
  8. 对于数据包的截取,使用linux中的netfilter钩子函数
  9. mysql的text类型长度问题
  10. GPS获取Location 获取所在地点的经纬度
  11. jQuery append xmlNode 修改 xml 内容
  12. sqlsever2008数据库的备份与还原
  13. 实训第二天早上--hibernate之配置文件映射和注解
  14. html5 实现手机端相册浏览功能
  15. Tomcat的JVM内存大小如何设置?【转】
  16. DFS(White-Gray-Black)
  17. android--listview设置高度
  18. (简单) POJ 3268 Silver Cow Party,Dijkstra。
  19. vi 编辑器笔记
  20. mssql sqlserver 将字段null(空值)值替换为指定值的三种方法分享

热门文章

  1. Linux下汇编语言学习笔记54 ---
  2. operamasks—omGrid/omBorderLayout的混合使用
  3. Java中如何获取spring中配置的properties文件内容
  4. Java的文件注释
  5. spring SSH整合
  6. Linux挂载新盘
  7. ubuntu语言设置成汉语
  8. HTML5:理解head
  9. Tcl脚本调用高层API实现仪表使用和主机创建配置的自己主动化測试用例
  10. hdu1078 FatMouse and Cheese(记忆化搜索)