hdoj-6374-度度熊拼三角

 

度度熊拼三角

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 。

現在要挑選其中的三根,問能拼出的三角形的最大周長是多少。

如果不能拼成任何一個三角形,輸出 −1 。

 

 

Input

多組數據(不超過10 組),讀到EOF結束。

對於每一組數據:

第一行一個數 N 表示木棒數量。

第二行一共 N 個數,描述每一根木棒的長度。

1≤N≤1000

木棒長度都是不超過100000 的正整數

 

Output

對於每一組數據,輸出一個數表示答案。

 

Sample Input

3

1 1 100

7

1 9 9 90 2 2 4

 

Sample Output

-1

22

 

 

Source

2018 “百度之星”程序設計大賽 - 初賽(A)

 

剛看到這道題時的第一反應就是暴力窮舉,結果超時,於是想到了與快排進行結合的方法:

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章