度度熊拼三角Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1560 Accepted Submission(s): 679 Problem Description 度度熊有 N 根木棒,每根木棒的長度爲ai 。
Input 多組數據(不超過10 組),讀到EOF結束。
Output 對於每一組數據,輸出一個數表示答案。
Sample Input 3 1 1 100 7 1 9 9 90 2 2 4
Sample Output -1 22
Source |
剛看到這道題時的第一反應就是暴力窮舉,結果超時,於是想到了與快排進行結合的方法:
1)將數據先從小到大進行排序
2)根據排序後的數據,從前向後遍歷(三重for循環,第一層代表三角形的第一條邊,第二層代表三角形的第二條邊,第三層代表三角形的最後一條邊),當前兩條邊之和小於第三個數時就跳出第三層的循環(三角形的任意兩邊之和必須大於第三條邊),這樣可以節省一定的時間
3)根據遍歷的結果取最大值即可
想到這種方法後自我感覺應該很隨意AC,然而只是自己意淫罷了(還是超時~~)
後來突然靈光一閃:
1)將數據從大到小進行排序
2)根據排序後的數據,仍然從前向後遍歷(....),當第一條邊減去第二條邊的值大於第三條邊時不滿足條件及時跳出第三層的循環,當滿足條件時計算三角形的周長,此時可以跳出所有的循環了,第一個合法的值就是要找的最大周長(不懂的自行腦補吧,懶得敲了...)
3)輸出結果
AC代碼:
#include<stdio.h>
#include<stdlib.h>
int a[1005];
int cmp(const void *a, const void *b)
{
return *(int *)b - *(int *)a;
}
int isTriangle(int &i,int &j,int &k)
{
if(a[i]+a[j]>a[k] && a[i]+a[k]>a[j] && a[j]+a[k]>a[i])
return a[i]+a[j]+a[k];
return -1;
}
int main()
{
int n,i,j,k,m,t;
while(scanf("%d",&n) != EOF)
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
m = -1;
qsort(a,n,sizeof(a[0]),cmp);
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
for(k=j+1;k<n;k++)
{
if(a[j]+a[k]<=a[i])
break;
t = isTriangle(i,j,k);
m = m > t ? m : t;
}
if(m > 0)
break;
}
if(m > 0)
break;
}
printf("%d\n",m);
}
return 0;
}