标签(空格分隔): 挑战程序设计竞赛 算法竞赛ios
题目很简单,就是输入一个数n,表示接下来输入一个有n个元素的数列,做为一些帮的长度,而后挑选其中的棒组成周长最长的三角形,输出这个最大周长。算法
input 5 2 3 4 5 10 output 12
很简单的一道小题,可是用的方法不少样。书上给了所有遍历的方法,计算每个可行组合的长度,输出最大值。可是计算复杂度太大了,是o(n^3)。这里还有一种办法。函数
考虑这个问题,能否排序后作。若是排序后最大的三个元素之和知足条件(两边之和大于第三边),那这一个确定就是最佳答案;反之,若是排序后最大的三个元素之和不知足条件,那以这三个元素中的最大元素为最长边的组合确定也不能知足条件了,由于另外两个边亦是剩下的全部边中最大的,若是它们的和都不大于最长边,那其他边的和确定也不大于了。此时,就能够如下一个元素做为最长边,继续该算法过程。
实现起来也很容易,就是得用qsort等排序函数。ui
#include <iostream>
#include <algorithm>
#include <cstdlib>
#define N 1005
using namespace std;
int a[N];
int cmp(const void *a,const void *b) {return -*(int*)a+*(int*)b;}
int main() {
int n,i=0,n0,ans=0;
scanf("%d",&n);n0=n;
while (n0--) scanf("%d",&a[i++]);
qsort(a,n,sizeof(int),cmp);
for (int j=0;j<n;j++) {
if (a[j]<a[j+1]+a[j+2]) {
ans=a[j]+a[j+1]+a[j+2];
break;
}
}
printf("%d\n",ans);
return 0;
}
咱们按快排算法的平均复杂度o(nlogn)做为指标(虽然常常比这个要快),那么上述算法的时间复杂度大体为o(nlogn)+o(n)=o(nlogn),显然比原先的o(n^3)要快得多。这也是书上提示,可是未说明的那种复杂度o(nlogn)的算法。若是把快排换成归并排序,也能够。spa