標籤(空格分隔): 挑戰程序設計競賽 算法競賽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